java中常用的加密算法总结

2023-12-21 00:20:14

目前在工作中常用到加密的一些场景,比如密码加密,数据加密,接口参数加密等,故通过本文总结以下常见的加密算法。
在这里插入图片描述

1. 对称加密算法

对称加密算法使用相同的密钥进行加密和解密。在Java中,常见的对称加密算法包括:

  • AES(高级加密标准):AES是一种高效且安全的对称加密算法,支持128位、192位和256位密钥长度,用于加密敏感数据。

    • CBC模式(Cipher Block Chaining)
      在CBC模式中,每个明文块在加密之前都会与前一个密文块进行异或运算,然后再进行加密。这种模式下,初始块需要一个初始化向量(IV),并且对每个后续块的加密都依赖于前一个块的密文。
    • 优点:提供了更高的安全性,相比ECB模式更难受到攻击。
      对相同的明文块会生成不同的密文块,增强了安全性。
    • 缺点:不适合并行加密处理,因为每个密文块的生成都依赖于前一个密文块。
  • ECB模式(Electronic Codebook)

    • 在ECB模式中,相同的明文块会被加密成相同的密文块,因此这种模式下可能会有一些安全性问题。同一个明文块每次加密的结果都是相同的,这可能导致一些模式识别攻击。
    • 优点:可以并行处理数据块。
    • 缺点:相同的明文块会得到相同的密文块,可能会暴露信息模式。
      安全性相对较低,容易受到已知明文攻击等攻击方式的影响。
      在实际应用中,CBC模式通常比ECB模式更安全,因为它提供了更好的混淆和扩散特性。为了进一步提高安全性,可以考虑使用认证加密模式(Authenticated Encryption Modes)如GCM(Galois/Counter Mode)或CCM(Counter with CBC-MAC)。
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

//AES加密解密工具类
public class AESUtil {

    private static final String AES_ALGORITHM = "AES";
    private static final String CIPHER_MODE = "AES/CBC/PKCS5Padding";
    private static final String INIT_VECTOR = "YourInitVector"; // 初始化向量
    private static final String SECRET_KEY = "YourSecretKey"; // 密钥

    public static String encrypt(String plainText) {
        try {
            IvParameterSpec iv = new IvParameterSpec(INIT_VECTOR.getBytes(StandardCharsets.UTF_8));
            SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);

            Cipher cipher = Cipher.getInstance(CIPHER_MODE);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);

            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String decrypt(String encryptedText) {
        try {
            IvParameterSpec iv = new IvParameterSpec(INIT_VECTOR.getBytes(StandardCharsets.UTF_8));
            SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), AES_ALGORITHM);

            Cipher cipher = Cipher.getInstance(CIPHER_MODE);
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);

            byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
            return new String(decryptedBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        String originalText = "Hello, World! This is a test message.";

        // 加密
        String encryptedText = encrypt(originalText);
        System.out.println("Encrypted Text: " + encryptedText);

        // 解密
        String decryptedText = decrypt(encryptedText);
        System.out.println("Decrypted Text: " + decryptedText);
    }
}
  • DES(数据加密标准):虽然已逐渐被AES取代,但DES仍被广泛使用。它使用56位密钥,对数据进行加密。

  • 3DES(Triple DES):是对DES进行多次迭代的改进版本,提高了安全性。

对称加密算法适合在数据传输过程中加密数据,但需要注意密钥管理和安全分发问题。

2. 非对称加密算法

非对称加密算法使用公钥私钥进行加密和解密。在Java中,最常用的非对称加密算法是:

  • RSA(Rivest-Shamir-Adleman):RSA是一种流行的非对称加密算法,用于数字签名和密钥交换。

  • DSA(数字签名算法):用于数字签名,验证数据的真实性和完整性。

非对称加密算法可以用于安全地交换密钥,也可用于数字签名和数据加密。

3. 哈希函数

哈希函数是一种单向加密算法,将任意长度的数据映射成固定长度的唯一哈希值。在Java中,常见的哈希函数有:

  • MD5:虽然MD5易受到碰撞攻击,但仍被广泛使用。

  • SHA-1、SHA-256、SHA-512:安全性更高的哈希算法,提供不同长度的哈希值。

哈希函数通常用于密码存储数字签名数据完整性验证

4. 消息摘要算法

消息摘要算法类似于哈希函数,但用于生成固定长度的数据摘要。Java中常用的消息摘要算法有:

  • MD5
  • SHA系列
    消息摘要算法常用于数据完整性验证和数字签名。

5. 密码学工具包

Java提供了javax.crypto和java.security等密码学工具包,使开发者能够轻松实现各种加密算法。这些工具包提供了对加密、解密、数字签名和密钥管理的支持。

文章来源:https://blog.csdn.net/Nanki_/article/details/135119527
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。