hutool 加密解密工具 SecureUtil
所属分类 hutool
浏览量 107
https://doc.hutool.cn/pages/SecureUtil/
加密算法分为三种
1、对称加密(symmetric),例如:AES、DES等
2、非对称加密(asymmetric),例如:RSA、DSA等
3、摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等
bcprov-jdk18on 和 bcpkix-jdk18on 是两个不同的Java库,它们都由Bouncy Castle提供,并且针对JDK 1.8及以上版本。
bcprov-jdk18on 主要用于加密算法的实现,而 bcpkix-jdk18on 则专注于处理PKIX证书链和X.509证书。
org.bouncycastle 是一个广泛使用的开源加密库,它为Java平台提供了丰富的密码学算法实现,包括对称加密、非对称加密、哈希算法、数字签名等。
在国密算法中,SM2是一种基于椭圆曲线的非对称加密算法,可以用于公开密钥加密、数字签名、随机数生成等多种用途
Bouncy Castle(简称BC库)是一个开源的Java密码学库,它提供了强大的密码学支持,包括实现国密算法中的SM2、SM3和SM4
BC库实现了国密算法的多个方面
SM2:一种基于椭圆曲线密码体系的非对称加密算法,用于公钥加密和数字签名。
SM3:一种消息摘要算法,用于生成固定长度的哈希值。
SM4:一种分组密码算法,用于对称加密
对称加密
SecureUtil.aes
SecureUtil.des
摘要算法
SecureUtil.md5
SecureUtil.sha1
SecureUtil.hmac
SecureUtil.hmacMd5
SecureUtil.hmacSha1
非对称加密
SecureUtil.rsa
SecureUtil.dsa
密钥生成
SecureUtil.generateKey 针对对称加密生成密钥
SecureUtil.generateKeyPair 生成密钥对(用于非对称加密)
签名摘要
createSignature
createMessageDigest
package crypto;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.MessageDigest;
import java.security.Signature;
public class SecureUtilDemo {
public static void main(String[]args)throws Exception {
System.out.println("hello hutool SecureUtil");
String str = "hello,你好";
byte[] dataBytes = str.getBytes(StandardCharsets.UTF_8);
String key = "1234567812345678";
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
// InvalidKeyException: Invalid AES key length
// key 密钥长度 16字节
String str2 = SecureUtil.aes(keyBytes).encryptHex(str);
System.out.println(str2);
str2 = SecureUtil.des(keyBytes).encryptHex(str);
System.out.println(str2);
str2 = SecureUtil.md5(str);
System.out.println("md5="+str2);
str2 = SecureUtil.sha1(str);
System.out.println("sha1="+str2);
str2 = SecureUtil.hmacMd5(key).digestHex(str);
System.out.println("hmacMd5="+str2);
str2 = SecureUtil.hmacSha1(key).digestHex(str);
System.out.println("hmacSha1="+str2);
// 对称加密生成密钥
byte[] keys = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
System.out.println("AES SecretKey:"+ HexUtil.encodeHexStr(keys));
keys = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
System.out.println("DES SecretKey:"+ HexUtil.encodeHexStr(keys));
// 生成密钥对
KeyPair pair = SecureUtil.generateKeyPair ("RSA");
byte[] publicKey = pair.getPublic().getEncoded();
byte[] privateKey = pair.getPrivate().getEncoded();
System.out.println("RSA publicKey:"+ HexUtil.encodeHexStr(publicKey));
System.out.println("RSA privateKey:"+ HexUtil.encodeHexStr(privateKey));
Signature signature = SecureUtil.createSignature(SignAlgorithm.MD2withRSA.getValue());
signature.initSign(pair.getPrivate());
signature.update(dataBytes);
byte[] signBytes = signature.sign();
signature.initVerify(pair.getPublic());
signature.update(dataBytes);
boolean signVerifyResult = signature.verify(signBytes);
System.out.println("MD2withRSA.signVerifyResult="+signVerifyResult);
MessageDigest messageDigest = SecureUtil.createMessageDigest(DigestAlgorithm.MD5.getValue());
byte[] md5bytes = messageDigest.digest(dataBytes);
System.out.println("md5 hexstring:"+HexUtil.encodeHexStr(md5bytes));
// SM2
// java.security.InvalidAlgorithmParameterException: Unknown curve name: sm2p256v1
// 增加依赖 org.bouncycastle:bcprov-jdk18on:1.74
pair = SecureUtil.generateKeyPair ("SM2");
publicKey = pair.getPublic().getEncoded();
privateKey = pair.getPrivate().getEncoded();
SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(str, KeyType.PublicKey);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println(encryptStr);
System.out.println(decryptStr);
signBytes = sm2.sign(dataBytes);
signVerifyResult = sm2.verify(str.getBytes(StandardCharsets.UTF_8),signBytes);
System.out.println("sm2.signVerifyResult="+signVerifyResult);
}
}
https://gitee.com/dyyx/work2024/blob/master/demo/hutooldemo/src/main/java/crypto/SecureUtilDemo.java
上一篇
下一篇
握笔姿势的重要性
Spring Security 和 Shiro
hutool IdUtil
Java开源加密库 Bouncy Castle BC库
国密算法
hutool 国密算法工具类 SmUtil