hutool工具的aes加密算法封装


1. hutool工具封装aes加密

1.1. 需求

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

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

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

(0)
上一篇 2022年10月11日
下一篇 2022年10月11日

发表回复

登录后才能评论