查看Hutool官网,会发现有许多封装好的方法,今天讲一下对称加密的注意点。
源代码:
//这一段,可以理解为需要进行加密的变量(如用户传递的密码)
String content = "test中文";
//随机生成密钥,实际就是没有规则的字符串
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//构建,创建一个类型为aes的加密方式
SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
//加密
byte[] encrypt = aes.encrypt(content);
//解密
byte[] decrypt = aes.decrypt(encrypt);
//加密为16进制表示
String encryptHex = aes.encryptHex(content);
//解密为字符串
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
封装:
public class SecretUtil {
//密钥
static final String key = "MzrLaIQFZPXZ8j+t1mfH9g==";
//构建
static SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes(StandardCharsets.UTF_8));
/**
* 加密
*
* @param passWord 密码
* @return String 字符串类型
*/
public static String encryptHex(String passWord) {
//加密为16进制表示
String encryptHex = aes.encryptHex(passWord);
return encryptHex;
}
/**
* 解密
*
* @param passWord 密码
* @return String 字符串类型
*/
public static String decryptStrHex(String passWord) {
//解密为字符串
String decryptStr = aes.decryptStr(passWord, CharsetUtil.CHARSET_UTF_8);
return decryptStr;
}
/**
* 加密-字节
*
* @param passWord 密码
* @return byte[] 字节数组
*/
public static byte[] encryptByte(String passWord) {
//加密
byte[] encrypt = aes.encrypt(passWord);
return encrypt;
}
/**
* 解密-字节
* @param passWord 密码
* @return byte[] 字节数组
*/
public static byte[] decryptStrByte(String passWord){
//解密
byte[] decrypt = aes.decrypt(passWord);
return decrypt;
}
/**
* 生成密钥
*/
public void generateKey() {
//随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//转成字符串
String sey = Base64.encode(key);
System.out.println(sey);
}
解析:
1.因为原来的生成密钥是随机的方式,是有生命周期,当每次程序重启时,创建的对象就会被释放(死亡),所以导致解密的时候密钥不一致。
//密钥
static final String key = "MzrLaIQFZPXZ8j+t1mfH9g==";
2.创建个Ase的加密方式,随便将字符串转换成byte数组。
//构建
static SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes(StandardCharsets.UTF_8));
3.返回加密、解密成16进制的字符串
/**
* 加密
*
* @param passWord 密码
* @return String 字符串类型
*/
public static String encryptHex(String passWord) {
//加密为16进制表示
String encryptHex = aes.encryptHex(passWord);
return encryptHex;
}
/**
* 解密
*
* @param passWord 密码
* @return String 字符串类型
*/
public static String decryptStrHex(String passWord) {
//解密为字符串
String decryptStr = aes.decryptStr(passWord, CharsetUtil.CHARSET_UTF_8);
return decryptStr;
}
4.(重点)加密时有些字符会占更多的字节,导致密码不相等,所以有时候用到byte的加密解密
/**
* 加密-字节
*
* @param passWord 密码
* @return byte[] 字节数组
*/
public static byte[] encryptByte(String passWord) {
//加密
byte[] encrypt = aes.encrypt(passWord);
return encrypt;
}
/**
* 解密-字节
* @param passWord 密码
* @return byte[] 字节数组
*/
public static byte[] decryptStrByte(String passWord){
//解密
byte[] decrypt = aes.decrypt(passWord);
return decrypt;
}
5.生成一个随机的密钥,然后转化成字符串
/**
* 生成密钥
*/
public void generateKey() {
//随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//转成字符串
String sey = Base64.encode(key);
System.out.println(sey);
}