目录
一、前言简介
二、对称加密(AES – 最常用)
三、非对称加密(RSA)
四、哈希算法(SHA-256)
五、使用KeyStore管理密钥(高级)
六、对比使用
七、注意事项
一、前言简介
-
在Java中实现加密功能主要依赖于Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE)。
-
Java Cryptography Architecture (JCA) 是 Java 平台的核心安全框架,提供了一套标准化的 API 用于实现加密、密钥管理、数字签名、消息摘要等安全功能。它采用提供者架构(Provider Architecture),允许开发者灵活选择不同的加密实现,同时保持代码的算法独立性。
-
Java Cryptography Extension(JCE)是 Java 平台的核心加密框架,提供了一套标准化的 API 用于实现加密、密钥管理、消息认证码(MAC)、安全流等高级安全功能。它是 Java 安全体系(JCA)的扩展,专注于提供强加密能力,现已成为 Java 标准库的核心组件(JDK 1.4+ 起集成)。
二、对称加密(AES – 最常用)
-
核心概念:使用同一个密钥进行加密和解密
-
特点:
-
速度快,适合大数据量加密
-
密钥需要安全传输(主要缺点)
-
-
常见算法:AES(128/256位)、DES(已淘汰)
-
应用场景:
-
文件加密(如加密压缩包)
-
数据库字段加密
-
HTTPS通信中的会话密钥
-
-
Java示例:
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESEncryption {
private static final String ALGORITHM = "AES";
public static String encrypt(String data, String secretKey) throws Exception {
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String encryptedData, String secretKey) throws Exception {
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes);
}
public static void main(String[] args) throws Exception {
String secretKey = "ThisIsASecretKey"; // 必须16/24/32字节
String original = "Hello, World!";
String encrypted = encrypt(original, secretKey);
System.out.println("加密后: " + encrypted);
String decrypted = decrypt(encrypted, secretKey);
System.out.println("解密后: " + decrypted);
}
}
三、非对称加密(RSA)
-
核心概念:使用密钥对(公钥加密,私钥解密)
-
特点:
-
解决密钥传输问题(公钥可公开)
-
速度慢(比对称加密慢1000倍)
-
-
常见算法:RSA、ECC(椭圆曲线)
-
应用场景:
-
数字签名(验证身份)
-
SSL/TLS握手
-
加密对称密钥(混合加密)
-
-
Java示例:
import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;
public class RSAEncryption {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048); // 密钥长度
return generator.generateKeyPair();
}
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes);
}
public static void main(String[] args) throws Exception {
KeyPair keyPair = generateKeyPair();
String original = "Secret Message";
String encrypted = encrypt(original, keyPair.getPublic());
System.out.println("加密后: " + encrypted);
String decrypted = decrypt(encrypted, keyPair.getPrivate());
System.out.println("解密后: " + decrypted);
}
}
四、哈希算法(SHA-256)
-
核心概念:生成数据的唯一指纹(不可逆)
-
特点:
-
单向函数(无法解密)
-
相同输入永远产生相同输出
-
雪崩效应(微小改动结果巨变)
-
-
常见算法:SHA-256、SHA-3、MD5(已不安全)
-
应用场景:
-
密码存储(加盐哈希)
-
数据完整性校验
-
区块链交易验证
-
-
Java示例:
import java.security.MessageDigest;
import java.util.HexFormat;
public class HashExample {
public static String sha256(String input) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes());
return HexFormat.of().formatHex(hash); // Java 17+ 的十六进制转换
}
public static void main(String[] args) throws Exception {
String data = "Password123!";
String hashed = sha256(data);
System.out.println("SHA-256 哈希值: " + hashed);
}
}
五、使用KeyStore管理密钥(高级)
-
核心概念:安全管理密钥和证书的保险箱
-
特点:
-
密码保护访问
-
支持硬件加密模块(HSM)
-
可存储多种类型密钥
-
-
常见格式:JKS(Java原生)、PKCS12(跨平台)
-
应用场景:
-
SSL服务器证书存储
-
应用配置加密密钥
-
代码签名证书管理
-
-
Java示例:
import java.security.*;
import java.security.cert.Certificate;
public class KeyStoreExample {
public static void main(String[] args) throws Exception {
// 创建KeyStore
KeyStore keyStore = KeyStore.getInstance("PKCS12");
char[] password = "keystorePass".toCharArray();
keyStore.load(null, password); // 初始化空KeyStore
// 生成密钥并存储
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey secretKey = keyGen.generateKey();
KeyStore.SecretKeyEntry keyEntry = new KeyStore.SecretKeyEntry(secretKey);
keyStore.setEntry("myAESKey", keyEntry, new KeyStore.PasswordProtection(password));
// 从KeyStore获取密钥
Key key = keyStore.getKey("myAESKey", password);
System.out.println("恢复的密钥: " + key.getAlgorithm());
}
}
六、对比使用
对称加密 | 单一密钥(需保密) | ⚡ 极快 | 密钥长度(AES-256) | 大数据加密 |
非对称加密 | 密钥对(公钥/私钥) | 🐢 慢 | 密钥长度(RSA-2048) | 密钥交换/数字签名 |
哈希算法 | 无需密钥 | ⚡ 快 | 抗碰撞性 | 密码存储/数据校验 |
密钥库 | 集中保管多密钥 | – | 访问控制 | 密钥生命周期管理 |
七、注意事项
1. 密钥管理:
-
对称加密:密钥需安全存储(避免硬编码),推荐使用Java KeyStore
-
非对称加密:私钥必须严格保护,公钥可分发
2. 算法选择:
-
对称加密:AES(128/256位)
-
非对称加密:RSA(≥2048位)或 ECC
-
哈希:SHA-256 或 SHA-3
-
避免使用:DES、MD5、SHA-1(已不安全)
3. 增强安全性:
// 使用更安全的加密模式(如GCM)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
// 密码加密使用PBKDF2
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
4. 依赖:Java标准库已包含JCE,无需额外依赖
> 重要提示:生产环境务必咨询相关技术人员,加密实现错误可能导致严重漏洞!
评论前必须登录!
注册