Hutool 封装JDK的对称加密AES算法使用

Hutool

        Hutool 是一个小而全的Java工具类库,提供了很多常用的工具类。官网:https://www.hutool.cn/docs/#/

AES封装

       遇到一个场景,透出了业务的订单号,该订单号是由年月日+自增ID拼成,如20200916000066。用户查询订单详情时,本应该根据登录用户的id和订单号去数据库中查询,但是因为历史原因(直接用订单号查询了!)以及一些其他的因素,暂时没能这么做。这样就会有数据泄漏问题,因为很容易构造出一个正确的且数据库内存在的这种订单号,但是这个订单可能不属于登录的用户,这就有可能用户A可以查到B用户的订单数据,甚至把你系统内的全部数据取出来,造成严重的数据泄露。

       因为系统设计缺陷导致不能用用户ID和订单号查询,设计一种临时方案【只是临时方案,应该从根本上解决设计缺陷】:考虑对透出去的订单号采用对称加密方式解决数据泄漏问题。我们把数据库表中的的订单号通过对称加密(比如AES),把加密后的订单号给到用户前端。请求订单详情的接口入参中的订单号改为加密后的订单号,经过解密后得到数据库中的订单号用于查询即可。

       Hutool 中的对称加密是对JDK中自带实现的封装,使用方便简洁,对称加密-SymmetricCrypto

示例:

maven 依赖:

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.4.2</version>
    </dependency>

官网示例代码: 

    public static void main(String[] args) {
        String content = "test中文";
        // 随机生成密钥
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        // 构建
        AES aes = SecureUtil.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);
    }

       上面是随机生成的密钥,我们可以指定密钥,只要满足AES的密钥长度规则即可,比如128 bits 的密钥key,构造出对应的byte数组即可,如下就是一个符合要求的AES密钥(16 * 8 = 128, 一个 byte 等于 8 bit):

public final static byte[] aes_key = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

注意:

       1、QPS 敏感的接口需要关注加密、解密过程对接口执行总时长的影响。本地测试偶尔出现 AES aes = SecureUtil.aes(aes_key);这一步骤耗时较多的情况,加密、解密耗时反而很快。这个需要留意一下对生产环境接口QPS等的影响。

       2、对称加密,加密和解密用的是同一个密钥。上述代码中,如果对使用密钥A加密后的密文使用密钥B解密,会抛出异常:

public class AESTest {

    public final static byte[] aes_key = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

    public static void main(String[] args) {
        String content = "test中文";
        // 随机生成密钥
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        // 构建
        AES aes = SecureUtil.aes(key);
        AES aes1 = SecureUtil.aes(aes_key);
        // 加密为16进制表示
        String encryptHex = aes.encryptHex(content);
        // 解密为字符串
        String decryptStr = aes1.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

    }
}

异常信息:


Exception in thread "main" cn.hutool.crypto.CryptoException: BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
	at cn.hutool.crypto.symmetric.SymmetricCrypto.decrypt(SymmetricCrypto.java:388)
	at cn.hutool.crypto.symmetric.SymmetricCrypto.decrypt(SymmetricCrypto.java:424)
	at cn.hutool.crypto.symmetric.SymmetricCrypto.decryptStr(SymmetricCrypto.java:435)
	at hutool.AESTest.main(AESTest.java:33)
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
	at com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:975)
	at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1056)
	at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
	at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
	at javax.crypto.Cipher.doFinal(Cipher.java:2168)
	at cn.hutool.crypto.symmetric.SymmetricCrypto.decrypt(SymmetricCrypto.java:386)
	... 3 more

Process finished with exit code 1

 3、用户随便构造一个密文,请求订单详情接口,也会抛出上述异常,所以接口要注意对解密过程异常的捕获处理。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 您好!使用Hutool进行AES加密需要先引入HutoolJDK17的依赖,可以在pom.xml中添加如下代码: ```xml <dependencies> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk17</artifactId> <version>1.69</version> </dependency> </dependencies> ``` 然后可以使用HutoolAES工具类进行加密,示例代码如下: ```java import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES; public class AesTest { public static void main(String[] args) { String content = "Hello, world!"; // 待加密内容 String password = "1234567890123456"; // 密钥,长度必须为16位 // 初始化AES加密器 AES aes = SecureUtil.aes(password.getBytes()); // 加密内容 byte[] encrypt = aes.encrypt(content.getBytes()); // 输出加密结果 System.out.println(new String(encrypt)); } } ``` 其中,密码必须是16位长度的字符串,可以根据实际需求进行修改。 ### 回答2: Hutool AES是一个Java工具库,用于提供AES加密算法的实现。AES(Advanced Encryption Standard),也称为高级加密标准,是一种对称加密算法,是目前应用最广泛的加密算法之一。 JDK 17是Java Development Kit的最新版本,也是Java编程语言的一个平台。它提供了许多功能和工具来简化开发过程,并提供了强大的安全性支持。 Hutool AES结合了JDK 17的加密功能,提供了一种简单易用的方式来实现AES加密。通过Hutool AES,我们可以使用Java代码来加密和解密数据。 对于使用Hutool AES进行加密,我们首先需要创建一个AES加密器。然后,我们可以使用加密器的方法来加密和解密数据。加密过程中,我们需要指定密钥和加密模式。Hutool AES还提供了对填充模式和初始向量的支持,以增强加密的安全性。 使用Hutool AES加密数据的一个常见的应用场景是在进行敏感数据传输时,例如用户的密码或银行账号等。通过使用AES加密算法,我们可以将数据加密后再传输,以保护数据的安全性。 综上所述,Hutool AES结合了JDK 17的加密功能,提供了一个简单易用的方式来实现AES加密。使用Hutool AES,我们可以使用Java代码来加密和解密数据,以提高数据的安全性。 ### 回答3: Hutool是一个Java工具包,提供了一系列的工具类,包括加密解密工具类。其中,AES(Advanced Encryption Standard)是一种对称加密算法,它在加密和解密过程中使用相同的密钥。JDK 1.7是Java Development Kit的一个版本,是Java编程语言的一个开发平台。 Hutool中的AES加密功能可以在JDK 1.7环境中使用使用HutoolAES工具类,我们可以方便地对数据进行加密和解密操作。加密过程中,我们需要指定加密的内容和密钥,并可以选择加密模式、填充方式等。加密后的结果是一串密文,具有较高的安全性。解密过程中,我们需要指定解密的密文和密钥,然后使用相同的算法进行解密,得到原始的明文数据。 AES加密算法具有安全性强、可靠性高的特点,被广泛应用于网络通信、数据库存储等领域。通过使用HutoolAES加密功能,我们可以在JDK 1.7环境中方便地对数据进行保护,确保数据的安全性和机密性。 总之,Hutool提供的AES加密工具类可以在JDK 1.7环境中使用,帮助我们对数据进行加密和解密操作。这为我们提供了一个方便、高效的加密解密解决方案,保护了数据的安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值