7【hutool】hutool-crypto

1,145 阅读2分钟

该系列文章主要是对 hutool 工具类的介绍,详情可以参考

hutool.cn/docs/#/

  • 加密分为三种:
    • 对称加密(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);
}