private static SecretKeySpec generateMySQLAESKey(final String key, final String encoding) {
try {
final byte[] finalKey = new byte[16];
int i = 0;
for (byte b : key.getBytes(encoding)) {
finalKey[i++ % 16] ^= b;
}
return new SecretKeySpec(finalKey, "AES");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String encryptMysql(String str, String aesKey) {
try {
final Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// 一定要用上第三个参数,设置一个随机数种子,否则在linux下某些情况加密的密文不一致
SecureRandom secureRandom = new SecureRandom();
secureRandom.setSeed(1L);
cipher.init(Cipher.ENCRYPT_MODE, generateMySQLAESKey(aesKey, "UTF-8"), secureRandom);
return Hex.encodeHexString(cipher.doFinal(str.getBytes("UTF-8"))).toUpperCase();
} catch (Exception e) {
log.error("encryptMysql error", e);
}
return null;
}
linux环境下加密密文不一致,这个问题导致有时候能和mysql加密匹配,有时候却不行,设置一个随机数种子就可以了