该系列文章主要是对 hutool 工具类的介绍,详情可以参考
- 加密分为三种:
-
- 对称加密(symmetric)
- 非对称加密(asymmetric)
- 摘要加密(digest)
hutool-crypto 针对这三种加密类型分别封装,并提供常用的大部分加密算法。
1 加密介绍
对称加密算法
1)方式
使用同一个密钥对信息进行加解密
2)优点
速度快,适合加密大量数据
3)缺点
密钥的传递存在安全隐患,若密钥泄漏,容易引发消息内容的泄漏
4)常见算法
AES、DES、3DES,国密SM4
非对称加密
1)方式
公钥加密,私钥解密
2)优点
安全性更好,可以避免密钥在传递过程中泄漏
3)缺点
加解密需要花费更长的时间,速度慢,适合对少量数据进行加密
4)常见算法
RSA,DSA,ECC,国密SM2
摘要算法
1)方式
确切说,摘要算法不算一种加密,它是一种单向算法,将目标信息生成一段特定长度的唯一hash值,相反,不能通过这个 hash 重新获取目标信息
2)优点
不可逆,无法获取原始数据,适合密码等敏感信息的存储
3)缺点
存在哈希碰撞问题,即不同数据,最终生成的hash值相同
4)常见算法
MD5,SHA,SHA-1,HMAC,国密SM3
2 使用方式
/**
* 对称加密算法
*/
@Test
public void aesTest() {
String content = "hello world";
Console.log(content);
// 随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
AES aes = SecureUtil.aes(key);
String encrypt = aes.encryptBase64(content);
Console.log(encrypt);
String decryptStr = aes.decryptStr(encrypt);
Console.log(decryptStr);
}
@Test
public void desTest() {
String content = "hello world";
Console.log(content);
// 随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
DES des = SecureUtil.des(key);
String encrypt = des.encryptBase64(content);
Console.log(encrypt);
String decryptStr = des.decryptStr(encrypt);
Console.log(decryptStr);
}
/**
* 非对称加密算法
*/
@Test
public void rsaTest() {
KeyPair pair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue());
PrivateKey privateKey = pair.getPrivate();
PublicKey publicKey = pair.getPublic();
Console.log(Base64.encode(privateKey.getEncoded()));
Console.log(Base64.encode(publicKey.getEncoded()));
RSA rsa = SecureUtil.rsa(privateKey.getEncoded(), publicKey.getEncoded());
String content = "hello world";
// 公钥加密,私钥解密
String encrypt = rsa.encryptBase64(StrUtil.bytes(content, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
Console.log(encrypt);
String decrypt = rsa.decryptStr(encrypt, KeyType.PrivateKey);
Console.log(decrypt);
// 私钥加密,公钥解密
String encrypt2 = rsa.encryptBase64(StrUtil.bytes(content, CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);
Console.log(encrypt2);
String decrypt2 = rsa.decryptStr(encrypt2, KeyType.PublicKey);
Console.log(decrypt2);
}
/**
* 摘要算法
*/
@Test
public void md5Test() {
String content = "hello world";
MD5 md5 = SecureUtil.md5();
String digest = md5.digestHex(content, CharsetUtil.CHARSET_UTF_8);
Console.log(digest);
}
@Test
public void hmacTest() {
String content = "hello world";
HMac hMac = SecureUtil.hmacSha1();
String digest = hMac.digestHex(content);
Console.log(digest);
}