加密、解密算法 AES、DES
使用Hutool工具实现密钥+内容的加密与解密
Hutool是一个Java工具库,提供了丰富的加密解密工具类。下面我将介绍如何使用Hutool实现基于密钥的对称加密和解密。
签名方法 Mac、MessageDigest、Signature https://www.cnblogs.com/vipsoft/p/18795795
Java Hutool 实现非对称加密(RSA) https://www.cnblogs.com/vipsoft/p/18674812
1. 添加Hutool依赖
首先需要在项目中添加Hutool依赖:
Maven:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.20</version> <!-- 使用最新版本 -->
</dependency>
Gradle:
implementation 'cn.hutool:hutool-all:5.8.20'
2. 对称加密实现
Hutool支持多种对称加密算法,如AES、DES等。下面以AES为例:
加密方法
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
public class CryptoUtils {
/**
* AES加密
* @param content 明文内容
* @param key 密钥(16/24/32字节)
* @return 加密后的Base64字符串
*/
public static String encrypt(String content, String key) {
// 构建AES对象
AES aes = SecureUtil.aes(key.getBytes());
// 加密为16进制表示
return aes.encryptHex(content);
// 或者加密为Base64
// return aes.encryptBase64(content);
}
}
解密方法
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
public class CryptoUtils {
/**
* AES解密
* @param encryptStr 加密后的字符串
* @param key 密钥(必须与加密时相同)
* @return 解密后的原文
*/
public static String decrypt(String encryptStr, String key) {
// 构建AES对象
AES aes = SecureUtil.aes(key.getBytes());
// 解密字符串
return aes.decryptStr(encryptStr);
}
}
3. 使用示例
public class Main {
public static void main(String[] args) {
String content = "这是一段需要加密的敏感数据";
String key = "1234567890123456"; // AES密钥要求16/24/32字节
// 加密
String encrypted = CryptoUtils.encrypt(content, key);
System.out.println("加密结果: " + encrypted);
// 解密
String decrypted = CryptoUtils.decrypt(encrypted, key);
System.out.println("解密结果: " + decrypted);
}
}
4. 其他加密算法
Hutool还支持其他对称加密算法,使用方法类似:
DES加密示例
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;
public class DesCryptoUtils {
public static String encrypt(String content, String key) {
DES des = SecureUtil.des(key.getBytes());
return des.encryptHex(content);
}
public static String decrypt(String encryptStr, String key) {
DES des = SecureUtil.des(key.getBytes());
return des.decryptStr(encryptStr);
}
}
5. 注意事项
-
密钥长度:
- AES:16/24/32字节
- DES:8字节
- 3DES:24字节
-
安全性:
- 不要使用简单易猜的密钥
- 实际项目中密钥应该安全存储,不要硬编码在代码中
-
异常处理:
- 实际使用时应该添加异常处理
- 加密解密可能抛出
CryptoException
-
编码问题:
- 确保加密解密使用相同的字符编码(通常UTF-8)
以上示例展示了如何使用Hutool进行基于密钥的对称加密和解密操作。根据实际需求,你可以选择不同的加密算法和配置参数。
AES与DES加密算法的区别及应用场景
一、AES与DES的主要区别
| 对比维度 | AES (Advanced Encryption Standard) | DES (Data Encryption Standard) |
|---|---|---|
| 推出时间 | 2001年 | 1977年 |
| 密钥长度 | 128/192/256位 | 56位(实际64位,但8位用于奇偶校验) |
| 分组长度 | 128位 | 64位 |
| 加密轮数 | 10/12/14轮(取决于密钥长度) | 16轮 |
| 安全性 | 高,目前无已知有效攻击 | 低,已被暴力破解 |
| 算法结构 | 置换-置换网络(SPN) | Feistel网络 |
| 性能 | 较快(硬件加速下更明显) | 较慢 |
| 标准化 | NIST标准 | 原NIST标准(已淘汰) |
二、安全性比较
-
AES:
- 目前没有已知的实用攻击方法能破解AES
- 即使使用256位密钥,在可预见的未来也是安全的
- 被美国政府用于保护最高机密信息(TOP SECRET)
-
DES:
- 1999年已被证明可在22小时内暴力破解
- 3DES(三重DES)提高了安全性但效率低下
- 已被NIST于2005年正式废弃
三、性能比较
-
软件实现:
- AES通常比DES/3DES快5-10倍
- AES算法设计更适合现代处理器
-
硬件实现:
- 现代CPU(如Intel AES-NI指令集)对AES有专门优化
- AES硬件加速后性能可提升10倍以上
四、典型应用场景
AES适用场景:
-
高安全性需求:
- 政府机密通信
- 军事数据加密
- 金融交易安全(如SSL/TLS)
-
大数据量加密:
- 全磁盘加密(如BitLocker)
- 数据库字段加密
- 大文件加密
-
现代协议标准:
- WiFi加密(WPA2/WPA3)
- VPN协议(IPSec)
- SSH协议
DES/3DES适用场景:
-
遗留系统维护:
- 需要与老旧系统兼容时
- 传统银行系统(逐步淘汰中)
-
低安全性需求:
- 内部非敏感数据加密
- 短期数据保护
-
法律合规要求:
- 某些行业特定法规可能暂时要求(越来越少)
五、选择建议
-
优先选择AES的情况:
- 所有新开发的系统
- 需要高安全性的应用
- 处理大量数据的场景
- 需要硬件加速的场景
-
可能考虑3DES的情况:
- 必须与老旧系统交互时
- 受限于特定行业法规时
- 短期过渡方案
-
不应使用DES的情况:
- 任何新系统设计
- 敏感数据传输
- 长期数据保护
六、Java实现示例对比
AES实现(Hutool):
// 加密
AES aes = SecureUtil.aes(key.getBytes());
String encrypted = aes.encryptHex(content);
// 解密
String decrypted = aes.decryptStr(encrypted);
3DES实现(Hutool):
// 加密
DESede des = SecureUtil.desede(key.getBytes()); // 密钥必须24字节
String encrypted = des.encryptHex(content);
// 解密
String decrypted = des.decryptStr(encrypted);
七、迁移建议
- 仍在使用DES/3DES的系统应尽快迁移到AES
- 迁移过程可采用双加密过渡方案:
- 新数据使用AES加密
- 旧数据保持3DES加密但逐步转换
- 密钥管理应同步升级
总结
AES作为DES的替代标准,在安全性、性能和适应性方面全面优于DES。除非有特殊的兼容性要求,现代系统都应采用AES作为默认的对称加密算法。DES因其固有的安全性弱点,已不再适合用于保护敏感信息。
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18797351
浙公网安备 33010602011771号