一、该问题的重现步骤是什么?
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 号技师,记得好评!!!
扫一扫访问 Blade技术社区 移动端