如何用SQL解密 AesUtil.encryptToBase64

Blade 已结 2 826
elvis
elvis 2022-05-27 05:10

一、该问题的重现步骤是什么?

1.  数据用 AesUtil.encryptToBase64 加密存储 电话号码

2.  用SQL语句 AES_DECRYPT(from_base64(od.contact_phone), 'O2BEeIv399qHQNhD6aGW8R8DEj4bqAAA') 解密,解密不成功

3.


二、你期待的结果是什么?实际看到的又是什么?

期待解密出电话号码 13912341234,实际是空的。


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

Bladex 2.8.1,linux


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

2条回答
  •  如梦技术
    2022-05-27 11:52

    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 号技师,记得好评!!!


提交回复