Hutool(封装对称加密的注意事项!)

        查看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);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值