1. AES(对称加密算法)
简介
AES(Advanced Encryption Standard) 是一种对称加密算法,用于加密和解密数据。
它使用相同的密钥进行加密和解密,密钥必须保密。
常用于加密文件、数据库数据和网络通信。
使用场景
加密敏感数据:如果需要加密数据(如文件、密码、消息),并且加密和解密操作由同一个系统执行,则使用 AES。
加密流量:AES 可用于加密通信数据,如 HTTPS、VPN 等。
优点
快速高效,适合大数据量的加密。
可支持不同密钥长度(128-bit, 192-bit, 256-bit)。
示例:使用 AES 加密和解密字符串
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESExample {
// 加密
public static String encrypt(String data, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedData);
}
// 解密
public static String decrypt(String encryptedData, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedData);
}
public static void main(String[] args) throws Exception {
String key = "1234567890123456"; // 密钥(128-bit)
String originalData = "Hello, AES Encryption!";
String encryptedData = encrypt(originalData, key);
System.out.println("Encrypted: " + encryptedData);
String decryptedData = decrypt(encryptedData, key);
System.out.println("Decrypted: " + decryptedData);
}
}使用 AES 的时机:
加密文件:例如加密用户上传的文件。
保护敏感数据:如用户的信用卡信息、私人文档等。
2. BCrypt(哈希算法)
简介
BCrypt 是一种基于 Blowfish 加密算法的哈希算法,专为密码存储而设计。
BCrypt 引入了 加盐 和 工作因子(cost factor),使得哈希过程变得更加缓慢,从而有效防止暴力破解。
BCrypt 主要用于存储密码,而不是加密数据。
使用场景
密码存储:当你需要存储用户密码时,应该使用 BCrypt,而不是普通的哈希算法(如 MD5 或 SHA-1),因为 BCrypt 会进行加盐,并且可以通过调节成本因子增加计算难度,从而防止暴力破解。
防止暴力破解:BCrypt 的 计算复杂度可调,通过增加成本因子,提升计算时间,从而增加破解的时间成本。
优点
自动加盐,避免盐重复使用。
可调成本因子,越大越安全(但会增加计算时间)。
安全,抗暴力破解。
示例:使用 BCrypt 哈希密码
import org.mindrot.jbcrypt.BCrypt;
public class BCryptExample {
// 哈希密码
public static String hashPassword(String password) {
return BCrypt.hashpw(password, BCrypt.gensalt(12)); // 12 是工作因子
}
// 验证密码
public static boolean checkPassword(String password, String hashedPassword) {
return BCrypt.checkpw(password, hashedPassword);
}
public static void main(String[] args) {
String password = "mySecurePassword";
// 哈希密码
String hashedPassword = hashPassword(password);
System.out.println("Hashed Password: " + hashedPassword);
// 验证密码
boolean isPasswordCorrect = checkPassword(password, hashedPassword);
System.out.println("Password is correct: " + isPasswordCorrect);
}
}使用 BCrypt 的时机:
密码存储:用于存储用户的密码,不直接存储明文密码,而是存储经过哈希和加盐的密码。
身份验证:用于在用户登录时验证输入的密码是否与存储的哈希值匹配。
3. PBKDF2(密钥派生函数)
简介
PBKDF2(Password-Based Key Derivation Function 2) 是一种密钥派生函数,主要用于通过密码生成密钥。
它通过多次哈希运算(通常是上千次)来增强密码的安全性。
PBKDF2 适用于需要从密码生成加密密钥的场景。
使用场景
加密密钥生成:当你需要通过用户密码生成加密密钥时,可以使用 PBKDF2。
高安全性需求:当你想要通过密码生成密钥并进行加密操作时,PBKDF2 提供了较高的安全性。
密钥存储:PBKDF2 用于密钥管理系统,或者当你需要一个密码相关的密钥来加密数据时。
优点
可以生成密钥而不是存储密码本身。
通过设置迭代次数,增加密码破解的难度。
常用于密码学应用中,生成密钥。
示例:使用 PBKDF2 哈希密码
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.SecureRandom;
import java.util.Base64;
public class PBKDF2Example {
public static String hashPassword(String password, byte[] salt) throws Exception {
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 10000, 256);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] hash = factory.generateSecret(spec).getEncoded();
return Base64.getEncoder().encodeToString(hash);
}
public static void main(String[] args) throws Exception {
String password = "mySuperSecretPassword";
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
// 哈希密码
String hashedPassword = hashPassword(password, salt);
System.out.println("Hashed Password with PBKDF2: " + hashedPassword);
}
}使用 PBKDF2 的时机:
生成加密密钥:将密码转换为加密密钥用于 AES 或其他加密算法。
高安全性密码存储:用于存储密码的哈希值,同时防止暴力破解。
总结:使用场景选择
总结:
AES 主要用于加密数据。
BCrypt 适用于密码的哈希存储。
PBKDF2 用于生成加密密钥,或者在高安全性要求下存储密码。
存储密码 → BCrypt / PBKDF2
数据加密 → AES
从密码生成密钥 → PBKDF2