首页  

hutool 加密解密工具 SecureUtil     所属分类 hutool 浏览量 98
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