Hutool官网文档地址:
https://www.hutool.cn/docs/#/
简介
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
cn.hutool hutool-all 5.8.4
String content = "test中文";//随机生成密钥byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();//构建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);
问题
使用Huool的AES算法如何指定公钥key值?
使用官方的demo采用的是生成随机的key,但是这个这个key我们不知道它生成的随机值是多少?也没有找到可以获取这个生成的随机key值的接口,如有小伙伴知道的话私信我,让我长长见识哈,下面是我自己写的一个utils:
package com.dytz.barrier.gate.web.util;import cn.hutool.core.util.CharsetUtil;import cn.hutool.crypto.Mode;import cn.hutool.crypto.Padding;import cn.hutool.crypto.symmetric.AES;import cn.hutool.crypto.symmetric.SymmetricAlgorithm;import lombok.extern.slf4j.Slf4j;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;/*** @author zlf* @description:* @time: 2022/8/31 11:10* 密钥必须为16字节或者16字节的倍数的字节型数据。* 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全。*/4jpublic class AesUtil {private static AES aes = null;/*** 16字节*/private static String keyStr = "xxxxxxx";//长度为16位的盐值private static final String IV_KEY = "sdfsdf12345sfsdf";static {// 构建//随机生成密钥SecretKeySpec secretKeySpec = new SecretKeySpec(getBytes(keyStr, 16), SymmetricAlgorithm.AES.getValue());IvParameterSpec ivParameterSpec = new IvParameterSpec(IV_KEY.getBytes());aes = new AES(Mode.CBC, Padding.ZeroPadding, secretKeySpec, ivParameterSpec);}/*** 破解时密匙长度是规定了的* 如果密匙长度有问题会报错:Key length not 128/192/256 bits.* 意思就比如密匙长度不是16位 就会报错~* 所以需要填充密匙长度** @param s* @param length* @return*/private static byte[] getBytes(String s, int length) {int fixLength = length - s.getBytes().length;if (s.getBytes().length < length) {byte[] S_bytes = new byte[length];System.arraycopy(s.getBytes(), 0, S_bytes, 0, s.getBytes().length);for (int x = length - fixLength; x < length; x++) {S_bytes[x] = 0x00;}return S_bytes;}return s.getBytes();}/*** 加密** @param content* @return*/public static String encryptHex(String content) {// 加密byte[] encrypt = aes.encrypt(content);// 加密为16进制表示String encryptHex = aes.encryptHex(content);return encryptHex;}/*** 解密** @param encryptHex* @return*/public static String decryptHex(String encryptHex) {// 解密为字符串String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);return decryptStr;}public static void main(String[] args) {String content = "test中文";log.info("content:{}", content);// 加密为16进制表示String encryptHex = encryptHex(content);log.info("encryptHex:{}", encryptHex.toUpperCase());// 解密为字符串String decryptStr = decryptHex(encryptHex);log.info("decryptStr:{}", decryptStr);}}
即可直接使用,Hutool工具包里面有很多好用的工具类,可以直接拿来使用,有轮子就不去重复制造轮子,但是可以学习使用各种轮子的code和一些好的设计方法和思想,然后应用到我们自己的项目中来简化代码和提高代码质量,同时也提高了我们的开发产出效率,除非轮子不好用,那就直接修改它的code,否则,都很少去制造轮子,如果项目进度紧的话,等我们制造好轮子,然后项目就《凉凉》了。

