1.java测试加密代码:
AES和HEX加密及解密工具类:
/**
* AES加解密字符串工具类
*/
public class AesEncrypt {
public static void main(String[] args) {
String aes_en = aes_encrypt("AES工具1@!","123456");
System.out.println("AES加密:"+aes_en);
String aes_de = aes_decrypt("54faa6635e17933f3e4e33442e040a37","123456");
System.out.println("AES解密:"+aes_de);
}
/**
* AES加密
* @param content 加密明文
* @param strKey 加密key
* @return
*/
public static String aes_encrypt(String content, String strKey) {
try {
//获取处理过的AES密钥Key
SecretKey key = generateMySQLAESKey(strKey,"ASCII");
//创建密码器
Cipher cipher = Cipher.getInstance("AES");
//初始化为加密模式的密码器
cipher.init(Cipher.ENCRYPT_MODE, key);
//获取utf-8字符集加密内容字节数组
byte[] cleartext = content.getBytes("UTF-8");
//使用初始的加密模式密码器,对加密内容加密
byte[] ciphertextBytes = cipher.doFinal(cleartext);
//返回AES加密内容字符串
return new String(Hex.encodeHex(ciphertextBytes));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**
* AES解密
* @param content 解密密文
* @param aesKey 解密key(与加密同)
* @return
*/
public static String aes_decrypt(String content, String aesKey){
try {
//获取处理过的AES密钥Key
SecretKey key = generateMySQLAESKey(aesKey,"ASCII");
//创建密码器
Cipher cipher = Cipher.getInstance("AES");
//初始化为解密模式的密码器
cipher.init(Cipher.DECRYPT_MODE, key);
//获取密文内容字节数组
byte[] cleartext = Hex.decodeHex(content.toCharArray());
//使用初始的解密模式密码器,对加密内容解密
byte[] ciphertextBytes = cipher.doFinal(cleartext);
//返回AES解密字符串
return new String(ciphertextBytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (DecoderException e) {
e.printStackTrace();
}
return null;
}
/**
* AES加密key处理
* @param key
* @param encoding
* @return
*/
public 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;
//根据字节数组生成AES密钥Key
return new SecretKeySpec(finalKey, "AES");
} catch(UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
2.数据库测试加密函数:
Hex(加密)、Unhex(解密)、AES_ENCRYPT(加密)、AES_DECRYPT(解密)
#查看
select HEX(AES_ENCRYPT('123456','11')) AS encrypt; #查看加密值
SELECT AES_DECRYPT(UNHEX('37793CE97D52B3C802B7319852115A4E'), '11') AS jieMi; #查看解密值
#新增==>加密
insert into user(name, encrypt_name) values('加密@1!',HEX(AES_ENCRYPT('加密@1!','123456')));
#查询==>解密
select name, AES_DECRYPT(UNHEX(encrypt_name), '123456') AS en_name from user;
#测试1:可以,不过会出现乱码==>测试成功
CREATE TABLE t_encrypt_1 (encrypt_1 varbinary(16), encrypt_2 binary(16), encrypt_3 blob);
INSERT INTO t_encrypt_1 VALUES (AES_ENCRYPT('明文1', 'key'), AES_ENCRYPT('明文2', 'key'), AES_ENCRYPT('明文3', 'key'));
SELECT AES_DECRYPT(encrypt_1, 'key'), AES_DECRYPT(encrypt_2, 'key'), AES_DECRYPT(encrypt_3, 'key') FROM t_encrypt_1;
#测试2:可以==>测试成功(推荐使用)
CREATE TABLE t_encrypt_2(encrypt2 char(32));
INSERT INTO t_encrypt_2 VALUES (HEX(AES_ENCRYPT('test2', 'key2')));
SELECT AES_DECRYPT(UNHEX(encrypt2), 'key2') FROM t_encrypt_2;
#测试3:可以(创建和添加时,做处理)==>测试成功
CREATE TABLE t_encrypt_3(encrypt3 varchar(32)) CHARSET latin1;
INSERT INTO t_encrypt_3 SELECT AES_ENCRYPT('text3', 'key3');
SELECT AES_DECRYPT(encrypt3, 'key3') FROM t_encrypt_3;