AES 加密,BCrypt 和PBKDF2

Administrator
发布于 2025-05-27 / 3 阅读
0
0

AES 加密,BCrypt 和PBKDF2

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

密钥派生(生成加密密钥或哈希密码)

通过多次哈希提高安全性

生成 AES 密钥、存储密码

总结:

  • AES 主要用于加密数据。

  • BCrypt 适用于密码的哈希存储。

  • PBKDF2 用于生成加密密钥,或者在高安全性要求下存储密码。

  • 存储密码BCrypt / PBKDF2

    数据加密AES

    从密码生成密钥PBKDF2


评论