一、该问题的重现步骤是什么?
1. 数据用 AesUtil.encryptToBase64 加密存储 电话号码
2. 用SQL语句 AES_DECRYPT(from_base64(od.contact_phone), 'O2BEeIv399qHQNhD6aGW8R8DEj4bqAAA') 解密,解密不成功
3.
二、你期待的结果是什么?实际看到的又是什么?
期待解密出电话号码 13912341234,实际是空的。
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
Bladex 2.8.1,linux
四、请提供详细的错误堆栈信息,这很重要。
无
五、若有更多详细信息,请在下面提供。
AesUtil 使用的是 CBC PKCS7 填充,mysql 查了下说默认使用的128位,加密方法为"ECB",填充方法为"PKCS7",
所以不一定能解出来。建议要么都用 mysql,要么都用 AesUtil,AesUtil 跟 js、dart 是通的
public class AesUtils {
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
private static byte[] encrypt(String context, String aesKey) {
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, generateMySqlAesKey(aesKey));
return cipher.doFinal(context.getBytes(DEFAULT_CHARSET));
} catch (Exception e) {
// log.error(e.getMessage(), e);
return new byte[0];
}
}
/**
* 转换成mysql aes
*
* @param key key
* @return SecretKeySpec
*/
public static SecretKeySpec generateMySqlAesKey(final String key) {
final byte[] finalKey = new byte[16];
int i = 0;
for (byte b : key.getBytes(DEFAULT_CHARSET)) {
finalKey[i++ % 16] ^= b;
}
return new SecretKeySpec(finalKey, "AES");
}
public static void main(String[] args) {
byte[] encode = Base64.getEncoder().encode(encrypt("13912341234", "O2BEeIv399qHQNhD6aGW8R8DEj4bqAAA"));
System.out.println(new String(encode));
}
}
这样就好了,我是 18 号技师,记得好评!!!
要用这个方法解密:org.springblade.core.tool.utils.AesUtil#decryptFormBase64
扫一扫访问 Blade技术社区 移动端