Hutool官网文档地址:
https://www.hutool.cn/docs/#/
简介
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
使用
AES是对称加密算法,加密解密使用的是同一把钥匙。
项目的pom中引入依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4</version>
</dependency>
官方文档中的demo
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字节需要进行补全。
*/
@Slf4j
public 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,否则,都很少去制造轮子,如果项目进度紧的话,等我们制造好轮子,然后项目就《凉凉》了。
都说我太胖
满身都是脂肪
背影像一堵墙
穿啥也都够呛
小姑娘难找对象
他们没撒谎
最怕你在身旁
你虽美的出柜
可是也求你体谅让一让
挡我阳光
其实我也只吃五谷杂粮
喝口凉水都是营养
别人一天只要吃三回
骗骗你却要翻倍