1. hutool工具封装aes加密
1.1. 需求
给一个字符串,使用aes加密后得到一个字符串,保存到数据库中,需要使用时,再解密使用
- 每次解密都重新生成一个秘钥,该如何实现?
- 整个系统只使用一个秘钥又该如何实现?
1.2. 源码
1.2.1. Key接口
包java.security
下的Key接口
public interface Key extends java.io.Serializable {
/**
* 返回此密钥的标准算法名称。 例如,“DSA”表示该密钥是 DSA 密钥
*/
public String getAlgorithm();
/**
* 返回此Key的主要编码格式的名称,如果此Key不支持编码,则返回 null。
*
* @return
*/
public String getFormat();
/**
* 以主要编码格式返回Key,如果此Key不支持编码,则返回 null
*
* @return
*/
public byte[] getEncoded();
}
对称加密
/**
* 对称加密算法<br>
* 在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。<br>
* 收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。<br>
* 在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。<br>
*
* @author Looly
*
*/
public class SymmetricCrypto {}
AES简介
/**
* AES加密算法实现<br>
* 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法<br>
* 对于Java中AES的默认模式是:AES/ECB/PKCS5Padding,如果使用CryptoJS,请调整为:padding: CryptoJS.pad.Pkcs7
*
* @author Looly
* @since 3.0.8
*/
public class AES extends SymmetricCrypto{}
得到AES对象
/**
* AES加密<br>
* 例:
*
* <pre>
* AES加密:aes(key).encrypt(data)
* AES解密:aes(key).decrypt(data)
* </pre>
*
* @param key 密钥
* @return {@link SymmetricCrypto}
*/
public static AES aes(byte[] key) {
return new AES(key);
}
encrypt
/**
* 加密,使用UTF-8编码
*
* @param data 被加密的字符串
* @return 加密后的bytes
*/
public byte[] encrypt(String data) {
return encrypt(StrUtil.bytes(data, CharsetUtil.CHARSET_UTF_8));
}
encryptHex
/**
* 加密,使用UTF-8编码
*
* @param data 被加密的字符串
* @return 加密后的Hex
*/
public String encryptHex(String data) {
return HexUtil.encodeHexStr(encrypt(data));
}
decryptStr
/**
* 解密Hex表示的字符串,默认UTF-8编码
*
* @param data 被解密的String
* @return 解密后的String
*/
public String decryptStr(String data) {
return decryptStr(data, CharsetUtil.CHARSET_UTF_8);
}
1.3. 代码
public class AESUtils {
/**
* base64格式的默认秘钥
* 也可以每次生成一个随机的秘钥,使用如下代码
* byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
* String secret = Base64.encode(key);
*/
private static final String BASE64_SECRET = "aEsva0zDHECg47P8SuPzmw==";
/**
* aes用来加密解密的byte[]
*/
private final static byte[] SECRET_BYTES = Base64.decode(BASE64_SECRET);
/**
* 根据这个秘钥得到一个aes对象
*/
private final static AES aes = SecureUtil.aes(SECRET_BYTES);
/**
* 使用aes加密
* @param content
* @return
*/
public static String AESEnCode(String content){
//加密完以后是十六进制的
return aes.encryptHex(content);
}
/**
* 使用aes算法,进行解密
* @param ciphertext
* @return
*/
public static String AESDeCode(String ciphertext){
return aes.decryptStr(ciphertext);
}
public static void main(String[] args) {
String string = "hello world";
String enCode = AESEnCode(string);
String dnCode = AESDeCode(enCode);
}
}