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(); }
对称加密
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); } }
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290871.html