hutool工具的aes加密算法封装

1. hutool工具封装aes加密

1.1. 需求

给一个字符串,使用aes加密后得到一个字符串,保存到数据库中,需要使用时,再解密使用

  1. 每次解密都重新生成一个秘钥,该如何实现?
  2. 整个系统只使用一个秘钥又该如何实现?

1.2. 源码

1.2.1. Key接口

hutool工具的aes加密算法封装

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);
    }
}
上一篇:Linux环境读取不到资源文件


下一篇:国人开源了一款小而全的 Java 工具类库,厉害啊!!