hutool库全面使用指南

在Java开发中,加密解密是保障数据安全的核心需求,广泛应用于用户密码存储、敏感信息传输、接口签名验签等场景。Java原生加密API(如JCE)语法繁琐、配置复杂,且容易因细节疏忽导致安全漏洞(如密钥管理不当、加密模式选择错误)。而 cn.hutool:hutool-crypto 作为Hutool工具包的核心模块之一,对Java原生加密API进行了高度封装,支持对称加密、非对称加密、哈希加密、签名验签、Base64编码等几乎所有常用加密场景,无需复杂配置,一行代码即可实现加密解密功能,极大提升开发效率并降低安全风险。本文将从环境集成、核心功能实战、常见场景落地、注意事项等方面,全面讲解hutool-crypto库的使用方法,帮助开发者快速上手。

一、hutool-crypto 库介绍与核心优势

1.1 库简介

hutool-crypto是Hutool工具集的加密解密专用模块,基于Java原生加密API(JCE)封装,无需依赖任何第三方加密库(如BouncyCastle,如需扩展特殊算法可额外引入),支持JDK8及以上版本。其核心设计理念是"简化加密操作,屏蔽底层细节",让开发者无需关注加密算法的底层实现、密钥生成、编码转换等繁琐步骤,专注于业务逻辑开发。

1.2 核心优势

  • 简洁易用:封装原生API,一行代码实现加密解密,避免冗余模板代码;

  • 算法全面:支持对称加密(AES、DES、3DES等)、非对称加密(RSA、DSA等)、哈希加密(MD5、SHA系列、HMAC等)、签名验签(RSA签名、DSA签名等);

  • 无侵入性:独立模块,可单独引入,不依赖Hutool其他模块;

  • 安全可靠:默认配置符合安全规范(如AES默认使用CBC模式、PKCS5Padding填充),避免原生API使用不当导致的安全漏洞;

  • 灵活扩展:支持自定义加密模式、填充方式、密钥长度,可集成BouncyCastle扩展更多特殊算法。

二、环境集成(快速上手第一步)

hutool-crypto可通过Maven、Gradle快速引入,无需额外配置,引入后即可直接使用。

2.1 Maven依赖(推荐)

复制代码
<!-- Hutool加密解密模块,当前最新稳定版:5.8.22 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-crypto</artifactId>
    <version>5.8.22</version>
</dependency>

2.2 Gradle依赖

复制代码
// Hutool加密解密模块
implementation 'cn.hutool:hutool-crypto:5.8.22'

2.3 环境说明

默认情况下,hutool-crypto基于JDK原生JCE实现,支持所有标准算法(如AES、RSA、MD5等);若需使用SM4、SM3等国密算法,需额外引入BouncyCastle依赖(后文国密算法部分会详细说明)。JDK版本要求:JDK8及以上(推荐JDK8,兼容性最好)。

三、核心加密功能实战(分模块详解)

本节按"对称加密→非对称加密→哈希加密→签名验签→Base64编码"的顺序,结合实战示例讲解hutool-crypto的核心用法,所有示例均可直接复制运行。

3.1 对称加密(最常用场景)

对称加密的核心特点是"加密和解密使用同一把密钥",加密效率高、适合大量数据加密,常见算法:AES(推荐,安全强度高)、DES(已过时,安全强度低)、3DES(DES的改进版)。hutool-crypto中对称加密的核心类是 SymmetricCrypto

3.1.1 AES加密(重点,实际开发首选)

AES是当前最常用的对称加密算法,安全强度高、效率高,支持128位、192位、256位密钥长度(JDK原生默认支持128位,256位需替换JCE无限制权限文件,hutool-crypto可自动适配)。hutool-crypto中AES默认配置:CBC模式、PKCS5Padding填充、随机IV向量(提升安全性)。

java 复制代码
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;

public class AesDemo {
    public static void main(String[] args) {
        // 1. 生成AES密钥(128位,可指定长度:128/192/256)
        // 方式1:随机生成密钥(推荐,每次生成不同密钥,需妥善保存)
        AES aes = SecureUtil.aes();
        byte[] key = aes.getKey(); // 获取密钥(字节数组)
        byte[] iv = aes.getIv();   // 获取IV向量(CBC模式必需,需和密钥一起保存)
        
        // 方式2:自定义密钥(需满足对应密钥长度,如128位密钥对应16个字符)
        // String customKey = "1234567890abcdef"; // 16个字符 = 128位
        // AES aes = SecureUtil.aes(customKey.getBytes(StandardCharsets.UTF_8));
        
        // 2. 待加密内容
        String content = "hutool-crypto AES加密测试,敏感信息:123456";
        
        // 3. 加密(三种常用方式,根据需求选择)
        byte[] encryptBytes = aes.encrypt(content); // 加密为字节数组
        String encryptHex = aes.encryptHex(content); // 加密为16进制字符串(推荐,便于存储传输)
        String encryptBase64 = aes.encryptBase64(content); // 加密为Base64字符串
        
        System.out.println("AES加密后(字节数组):" + encryptBytes);
        System.out.println("AES加密后(16进制):" + encryptHex);
        System.out.println("AES加密后(Base64):" + encryptBase64);
        
        // 4. 解密(对应加密方式,密钥和IV向量必须和加密时一致)
        byte[] decryptBytes = aes.decrypt(encryptBytes); // 解密字节数组
        String decryptStr1 = aes.decryptStr(encryptHex); // 解密16进制字符串(推荐)
        String decryptStr2 = aes.decryptStr(encryptBase64); // 解密Base64字符串
        
        System.out.println("AES解密后(字节数组转字符串):" + new String(decryptBytes));
        System.out.println("AES解密后(16进制转字符串):" + decryptStr1);
        System.out.println("AES解密后(Base64转字符串):" + decryptStr2);
    }
}
3.1.2 自定义AES模式和填充方式

若需自定义AES的加密模式(如ECB、GCM)、填充方式(如PKCS7Padding),可通过SymmetricCrypto构造方法手动配置:

java 复制代码
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

public class CustomAesDemo {
    public static void main(String[] args) {
        // 自定义密钥(128位)
        byte[] key = "1234567890abcdef".getBytes();
        // 自定义模式和填充方式:ECB模式、PKCS7Padding填充(ECB模式无需IV向量)
        SymmetricCrypto aes = new SymmetricCrypto("AES/ECB/PKCS7Padding", key);
        
        String content = "自定义AES模式和填充方式测试";
        String encryptHex = aes.encryptHex(content);
        String decryptStr = aes.decryptStr(encryptHex);
        
        System.out.println("加密后:" + encryptHex);
        System.out.println("解密后:" + decryptStr);
    }
}
3.1.3 DES/3DES加密(了解即可,不推荐)

DES安全强度低(56位密钥),3DES是DES的改进版(168位密钥),但效率低于AES,实际开发中优先使用AES。用法与AES类似,核心是指定算法类型:

java 复制代码
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.symmetric.TripleDES;

public class DesDemo {
    public static void main(String[] args) {
        // 1. DES加密(不推荐)
        DES des = SecureUtil.des();
        String desEncrypt = des.encryptHex("DES加密测试");
        String desDecrypt = des.decryptStr(desEncrypt);
        System.out.println("DES加密解密:" + desEncrypt + " → " + desDecrypt);
        
        // 2. 3DES加密(了解即可)
        TripleDES tripleDES = SecureUtil.tripleDES();
        String tripleDesEncrypt = tripleDES.encryptHex("3DES加密测试");
        String tripleDesDecrypt = tripleDES.decryptStr(tripleDesEncrypt);
        System.out.println("3DES加密解密:" + tripleDesEncrypt + " → " + tripleDesDecrypt);
    }
}

3.2 非对称加密(安全级别高场景)

非对称加密的核心特点是"加密和解密使用不同密钥(公钥加密、私钥解密;私钥加密、公钥解密)",安全强度高、适合小量数据加密(如密钥传输、接口签名),常见算法:RSA(推荐,应用最广)、DSA(仅支持签名,不支持加密)。hutool-crypto中非对称加密的核心类是 AsymmetricCrypto

3.2.1 RSA加密解密(重点)

RSA支持密钥长度1024位、2048位(推荐2048位,安全强度足够)、4096位,hutool-crypto可自动生成密钥对(公钥+私钥),也支持导入已有密钥对(如从文件、字符串导入)。

java 复制代码
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.AsymmetricCrypto;
import cn.hutool.crypto.asymmetric.RSA;

public class RsaDemo {
    public static void main(String[] args) {
        // 1. 生成RSA密钥对(2048位,推荐)
        RSA rsa = SecureUtil.rsa();
        String publicKey = rsa.getPublicKeyBase64(); // 公钥(Base64编码,可公开)
        String privateKey = rsa.getPrivateKeyBase64(); // 私钥(Base64编码,需保密)
        
        System.out.println("RSA公钥(Base64):" + publicKey);
        System.out.println("RSA私钥(Base64):" + privateKey);
        
        // 2. 导入已有密钥对(实际开发中常用,从配置文件/数据库读取)
        // String publicKey = "你的公钥Base64字符串";
        // String privateKey = "你的私钥Base64字符串";
        // RSA rsa = new RSA(privateKey, publicKey);
        
        // 3. 待加密内容(非对称加密适合小量数据,如密钥、敏感ID,不适合大量文本)
        String content = "RSA加密测试,敏感数据:userId=123456";
        
        // 4. 加密解密(公钥加密、私钥解密)
        AsymmetricCrypto ac = new AsymmetricCrypto("RSA", privateKey, publicKey);
        String encryptHex = ac.encryptHex(content, true); // true:使用公钥加密
        String decryptStr = ac.decryptStr(encryptHex, true); // true:使用私钥解密
        System.out.println("公钥加密后(16进制):" + encryptHex);
        System.out.println("私钥解密后:" + decryptStr);
        
        // 5. 私钥加密、公钥解密(适合签名场景,如数据防篡改)
        String encryptByPrivate = ac.encryptHex(content, false); // false:使用私钥加密
        String decryptByPublic = ac.decryptStr(encryptByPrivate, false); // false:使用公钥解密
        System.out.println("私钥加密后(16进制):" + encryptByPrivate);
        System.out.println("公钥解密后:" + decryptByPublic);
    }
}

3.3 哈希加密(不可逆加密,适合密码存储)

哈希加密是不可逆加密(无法通过加密结果反推原始内容),核心用于密码存储、数据校验(如文件校验),常见算法:MD5(已过时,安全强度低)、SHA-1(已过时)、SHA-256(推荐)、SHA-512、HMAC(带密钥的哈希加密,更安全)。hutool-crypto中哈希加密的核心工具类是 DigestUtil

3.3.1 SHA-256加密(密码存储首选)

SHA-256安全强度高,不可逆,实际开发中存储用户密码时,常结合"加盐"(salt)提升安全性,避免彩虹表破解。

java 复制代码
import cn.hutool.crypto.DigestUtil;
import cn.hutool.crypto.SecureUtil;

public class Sha256Demo {
    public static void main(String[] args) {
        // 1. 基础SHA-256加密(无盐,不推荐用于密码存储)
        String content = "123456"; // 原始密码
        String sha256Hex = DigestUtil.sha256Hex(content);
        System.out.println("SHA-256加密(无盐):" + sha256Hex);
        
        // 2. 加盐SHA-256加密(推荐用于密码存储,salt需随机生成并与密码一起存储)
        String salt = SecureUtil.randomString(16); // 生成16位随机盐值(每次加密不同)
        // 方式1:手动拼接盐值(原始密码 + 盐值)
        String pwdWithSalt = content + salt;
        String sha256WithSalt = DigestUtil.sha256Hex(pwdWithSalt);
        
        // 方式2:使用hutool自带加盐方法(更简洁)
        String sha256WithSalt2 = DigestUtil.sha256Hex(content, salt.getBytes());
        
        System.out.println("盐值:" + salt);
        System.out.println("加盐SHA-256加密(方式1):" + sha256WithSalt);
        System.out.println("加盐SHA-256加密(方式2):" + sha256WithSalt2);
        
        // 3. 密码校验(用户登录时,用相同盐值对输入密码加密,与数据库存储的加密结果对比)
        String inputPwd = "123456"; // 用户登录输入的密码
        String inputPwdEncrypt = DigestUtil.sha256Hex(inputPwd + salt);
        boolean isMatch = inputPwdEncrypt.equals(sha256WithSalt);
        System.out.println("密码校验结果:" + isMatch); // 输出true
    }
}
3.3.2 HMAC加密(带密钥的哈希加密)

HMAC是"哈希消息认证码",结合了哈希加密和密钥,比普通哈希加密更安全,适合接口参数校验、数据防篡改。

java 复制代码
import cn.hutool.crypto.DigestUtil;

public class HmacDemo {
    public static void main(String[] args) {
        // 1. 定义HMAC密钥(需双方约定,妥善保存)
        String hmacKey = "hutool_hmac_key_123456";
        String content = "HMAC加密测试,接口参数:name=test&age=20";
        
        // 2. HMAC-SHA256加密(推荐,也可选择HMAC-MD5、HMAC-SHA1等)
        String hmacSha256 = DigestUtil.hmacSha256Hex(content, hmacKey.getBytes());
        
        System.out.println("HMAC-SHA256加密结果:" + hmacSha256);
        
        // 3. 数据校验(接收方用相同密钥和内容加密,对比加密结果是否一致)
        String receivedContent = "HMAC加密测试,接口参数:name=test&age=20";
        String receivedHmac = DigestUtil.hmacSha256Hex(receivedContent, hmacKey.getBytes());
        boolean isTampered = hmacSha256.equals(receivedHmac);
        System.out.println("数据是否被篡改:" + !isTampered); // 输出false(未篡改)
    }
}

3.4 签名验签(接口安全场景)

签名验签是接口安全的核心手段,核心逻辑:发送方用私钥对数据签名(生成签名值),接收方用公钥验证签名(确认数据未被篡改、发送方合法),常见算法:RSA签名、DSA签名。hutool-crypto中签名验签的核心工具类是 SignUtil

3.4.1 RSA签名验签(实战常用)
java 复制代码
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.sign.RsaSign;
import cn.hutool.crypto.sign.SignAlgorithm;

public class RsaSignDemo {
    public static void main(String[] args) {
        // 1. 生成RSA密钥对(签名验签需使用同一密钥对)
        RSA rsa = SecureUtil.rsa();
        String publicKey = rsa.getPublicKeyBase64();
        String privateKey = rsa.getPrivateKeyBase64();
        
        // 2. 待签名数据(如接口请求参数拼接后的字符串)
        String data = "name=test&age=20&timestamp=1699999999999&appId=123456";
        
        // 3. 发送方:用私钥签名(使用SHA256withRSA算法,推荐)
        RsaSign sign = SecureUtil.rsaSign(privateKey, publicKey);
        String signature = sign.signHex(data, SignAlgorithm.SHA256withRSA);
        System.out.println("RSA签名值(16进制):" + signature);
        
        // 4. 接收方:用公钥验签(验证数据完整性和发送方合法性)
        boolean verify = sign.verifyHex(data, SignAlgorithm.SHA256withRSA, signature);
        System.out.println("签名验签结果:" + verify); // 输出true(验签通过)
        
        // 5. 篡改数据后验签(模拟数据被篡改)
        String tamperedData = "name=test&age=21&timestamp=1699999999999&appId=123456";
        boolean tamperedVerify = sign.verifyHex(tamperedData, SignAlgorithm.SHA256withRSA, signature);
        System.out.println("篡改数据后验签结果:" + tamperedVerify); // 输出false(验签失败)
    }
}

3.5 Base64编码解码(辅助场景)

Base64不是加密算法,是一种编码方式,用于将二进制数据转换为字符串(便于存储、传输,如加密后的字节数组转字符串)。hutool-crypto中Base64的工具类是 Base64(也可使用SecureUtil简化操作)。

java 复制代码
import cn.hutool.crypto.Base64;
import cn.hutool.crypto.SecureUtil;

public class Base64Demo {
    public static void main(String[] args) {
        // 1. 字符串Base64编码解码
        String content = "Base64编码测试123456";
        String encode = Base64.encode(content);
        String decode = Base64.decodeStr(encode);
        System.out.println("Base64编码:" + encode);
        System.out.println("Base64解码:" + decode);
        
        // 2. 字节数组Base64编码解码(加密后常用)
        byte[] bytes = content.getBytes();
        String encodeBytes = Base64.encode(bytes);
        byte[] decodeBytes = Base64.decode(encodeBytes);
        System.out.println("字节数组Base64编码:" + encodeBytes);
        System.out.println("字节数组Base64解码:" + new String(decodeBytes));
        
        // 3. 简化用法(使用SecureUtil)
        String encodeSimplify = SecureUtil.base64Encode(content);
        String decodeSimplify = SecureUtil.base64DecodeStr(encodeSimplify);
        System.out.println("简化编码:" + encodeSimplify);
        System.out.println("简化解码:" + decodeSimplify);
    }
}

四、实战综合案例(贴合实际开发场景)

结合前面的核心功能,以"用户登录+接口请求签名"为例,展示hutool-crypto在实际项目中的综合运用。

4.1 案例场景

  1. 用户注册:将用户密码用"加盐SHA-256"加密后存储到数据库;

  2. 用户登录:接收用户输入密码,用相同盐值加密后与数据库存储值对比,验证密码正确性;

  3. 接口请求:客户端用私钥对请求参数签名,服务端用公钥验签,确保接口安全。

4.2 完整代码实现

java 复制代码
import cn.hutool.crypto.DigestUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.sign.RsaSign;
import cn.hutool.crypto.sign.SignAlgorithm;

import java.util.HashMap;
import java.util.Map;

public class CryptoIntegratedDemo {
    // 模拟数据库存储用户信息(实际项目中存储到MySQL等数据库)
    private static final Map<String, User> userDb = new HashMap<>();
    // RSA密钥对(实际项目中,私钥存储在客户端/服务端配置文件,公钥公开)
    private static final RSA rsa = SecureUtil.rsa();
    private static final String PUBLIC_KEY = rsa.getPublicKeyBase64();
    private static final String PRIVATE_KEY = rsa.getPrivateKeyBase64();

    // 用户实体类(简化)
    static class User {
        private String username;
        private String encryptPwd; // 加密后的密码
        private String salt;       // 密码盐值

        public User(String username, String encryptPwd, String salt) {
            this.username = username;
            this.encryptPwd = encryptPwd;
            this.salt = salt;
        }

        // getter/setter
        public String getUsername() { return username; }
        public String getEncryptPwd() { return encryptPwd; }
        public String getSalt() { return salt; }
    }

    public static void main(String[] args) {
        // 1. 步骤1:用户注册(密码加密存储)
        String username = "test_user";
        String rawPwd = "12345678"; // 用户原始密码
        register(username, rawPwd);
        System.out.println("用户注册成功,数据库存储信息:" + userDb.get(username));

        // 2. 步骤2:用户登录(密码校验)
        boolean loginSuccess = login(username, rawPwd);
        System.out.println("用户登录结果:" + (loginSuccess ? "成功" : "失败"));

        // 3. 步骤3:接口请求签名验签(模拟客户端→服务端)
        // 客户端:构造请求参数、生成签名
        Map<String, String> requestParams = new HashMap<>();
        requestParams.put("username", username);
        requestParams.put("action", "queryUserInfo");
        requestParams.put("timestamp", String.valueOf(System.currentTimeMillis()));
        String sign = clientSign(requestParams);
        requestParams.put("signature", sign); // 将签名放入请求参数

        // 服务端:接收请求、验签、处理业务
        boolean verifySuccess = serverVerify(requestParams);
        if (verifySuccess) {
            System.out.println("接口验签通过,执行查询用户信息业务...");
            // 执行业务逻辑(如查询用户信息)
        } else {
            System.out.println("接口验签失败,拒绝处理请求(可能数据被篡改或非法请求)");
        }
    }

    /**
     * 1. 用户注册:密码加盐SHA-256加密存储
     */
    public static void register(String username, String rawPwd) {
        // 生成16位随机盐值
        String salt = SecureUtil.randomString(16);
        // 密码加密(原始密码 + 盐值 → SHA-256加密)
        String encryptPwd = DigestUtil.sha256Hex(rawPwd + salt);
        // 存储到数据库
        userDb.put(username, new User(username, encryptPwd, salt));
    }

    /**
     * 2. 用户登录:密码校验
     */
    public static boolean login(String username, String inputPwd) {
        // 从数据库查询用户
        User user = userDb.get(username);
        if (user == null) {
            return false; // 用户名不存在
        }
        // 用相同盐值对输入密码加密
        String inputEncryptPwd = DigestUtil.sha256Hex(inputPwd + user.getSalt());
        // 对比加密后的密码
        return inputEncryptPwd.equals(user.getEncryptPwd());
    }

    /**
     * 3. 客户端:生成接口请求签名
     */
    public static String clientSign(Map<String, String> params) {
        // 1. 拼接请求参数(按key排序,避免参数顺序导致签名不一致,实际项目中需排序)
        StringBuilder paramStr = new StringBuilder();
        params.keySet().stream().sorted().forEach(key -> 
                paramStr.append(key).append("=").append(params.get(key)).append("&")
        );
        // 去除最后一个&
        String data = paramStr.substring(0, paramStr.length() - 1);
        // 2. 用私钥签名
        RsaSign sign = SecureUtil.rsaSign(PRIVATE_KEY, PUBLIC_KEY);
        return sign.signHex(data, SignAlgorithm.SHA256withRSA);
    }

    /**
     * 3. 服务端:接口请求验签
     */
    public static boolean serverVerify(Map<String, String> params) {
        // 1. 取出签名值,移除参数中的signature(避免验签时包含自身)
        String signature = params.remove("signature");
        // 2. 拼接请求参数(与客户端拼接规则一致,按key排序)
        StringBuilder paramStr = new StringBuilder();
        params.keySet().stream().sorted().forEach(key -> 
                paramStr.append(key).append("=").append(params.get(key)).append("&")
        );
        String data = paramStr.substring(0, paramStr.length() - 1);
        // 3. 用公钥验签
        RsaSign sign = SecureUtil.rsaSign(PRIVATE_KEY, PUBLIC_KEY);
        return sign.verifyHex(data, SignAlgorithm.SHA256withRSA, signature);
    }
}

五、国密算法支持(可选,需额外依赖)

若项目需要使用SM2(非对称)、SM3(哈希)、SM4(对称)等国密算法,hutool-crypto支持集成BouncyCastle实现,需额外引入BouncyCastle依赖:

5.1 引入BouncyCastle依赖

java 复制代码
<!-- BouncyCastle,支持国密算法 -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.77</version>
</dependency>

5.2 国密算法实战示例(SM4对称加密)

java 复制代码
import cn.hutool.crypto.symmetric.SM4;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

public class Sm4Demo {
    public static void main(String[] args) {
        // 生成SM4密钥(128位)
        SM4 sm4 = new SM4();
        byte[] key = sm4.getKey();
        String content = "国密SM4加密测试,敏感信息:test123";
        
        // 加密解密
        String encryptHex = sm4.encryptHex(content);
        String decryptStr = sm4.decryptStr(encryptHex);
        
        System.out.println("SM4加密后:" + encryptHex);
        System.out.println("SM4解密后:" + decryptStr);
        
        // 自定义密钥(16个字符 = 128位)
        SymmetricCrypto sm4Custom = new SymmetricCrypto("SM4/ECB/PKCS7Padding", "1234567890abcdef".getBytes());
        String encryptCustom = sm4Custom.encryptHex(content);
        String decryptCustom = sm4Custom.decryptStr(encryptCustom);
        System.out.println("自定义密钥SM4加密后:" + encryptCustom);
        System.out.println("自定义密钥SM4解密后:" + decryptCustom);
    }
}

六、使用注意事项(避坑指南)

结合实际开发经验,整理hutool-crypto使用过程中最容易踩的坑,及对应的规避方法:

  1. 密钥安全管理(重中之重)

    1. 对称加密密钥(AES/DES)、非对称加密私钥(RSA私钥)需妥善保存,不可硬编码到代码中(避免打包后泄露),建议存储在配置文件(如application.yml)、环境变量或密钥管理服务(如阿里云KMS);

    2. RSA公钥可公开(如提供给客户端用于验签),私钥绝对不能公开,避免被恶意利用。

  2. 算法选择规范

    1. 对称加密:优先使用AES(128/256位),禁止使用DES(安全强度低);

    2. 哈希加密:密码存储优先使用"加盐SHA-256/SHA-512",禁止使用MD5、SHA-1(易被破解);

    3. 接口签名:优先使用RSA-SHA256,避免使用DSA(仅支持签名,不支持加密)。

  3. 编码格式统一:加密解密过程中,字符串与字节数组转换时,统一使用UTF-8编码,避免因编码不一致导致解密失败。

  4. 非对称加密适用场景:非对称加密(RSA)效率低、适合小量数据(如密钥、签名),禁止用于大量文本/文件加密,大量数据加密建议使用AES,结合RSA传输AES密钥。

  5. 盐值使用规范:密码加盐时,每个用户的盐值必须唯一、随机生成(如16位随机字符串),并与加密后的密码一起存储,不可共用盐值(共用盐值降低安全性)。

  6. 版本兼容性:hutool-crypto不同版本API可能有细微差异,建议项目中固定使用同一版本(如5.8.22),避免版本冲突。

  7. 异常处理 :加密解密过程中可能出现异常(如密钥错误、签名不匹配、算法不支持),需捕获CryptoException(hutool-crypto自定义异常),并给出明确的错误提示,便于排查问题。

七、总结

cn.hutool:hutool-crypto库的核心价值在于"简化加密解密操作,降低安全开发门槛",它封装了Java原生加密API的繁琐细节,让开发者无需深入理解加密算法原理,即可快速实现符合安全规范的加密解密功能。

本文从库的介绍、环境集成、分模块实战(对称加密、非对称加密、哈希加密、签名验签)、综合案例到注意事项,全面覆盖了hutool-crypto的核心用法。实际开发中,需根据具体业务场景选择合适的加密算法(如密码存储用加盐SHA-256,接口安全用RSA签名,大量数据加密用AES),同时严格遵循密钥安全管理规范,避免因细节疏忽导致安全漏洞。

hutool-crypto作为Hutool工具包的核心模块,除了本文讲解的功能,还支持文件加密、证书加密等高级功能,开发者可根据项目需求进一步探索其API文档,提升开发效率和系统安全性。

相关推荐
寻寻觅觅☆6 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
偷吃的耗子7 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
青云计划7 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿7 小时前
Jsoniter(java版本)使用介绍
java·开发语言
冬奇Lab7 小时前
Android系统启动流程深度解析:从Bootloader到Zygote的完整旅程
android·源码阅读
化学在逃硬闯CS7 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1238 小时前
C++使用format
开发语言·c++·算法
探路者继续奋斗8 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
Gofarlic_OMS8 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
夏鹏今天学习了吗8 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展