首页 > 解决方案 > 加密或散列

问题描述

我在网上有一个功能说这是 AES-256 位加密:

public static String encrypt(String strToEncrypt, String secret) 
{
    try
    {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);
         
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
         
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
    } 
    catch (Exception e) 
    {
        System.out.println("Error while encrypting: " + e.toString());
    }
    return null;
}

现在,这是使用 HMAC-SHA256。那么这实际上是 AES 还是散列?还是仅使用 HMAC 散列密钥?我的意思是 SHA-256 是一种散列算法?此外,这听起来可能很基本,但 HMAC 是散列/加密吗?

标签: javaencryptionaes

解决方案


这是使用PKBDF2将密码延伸到密钥中。然后它使用该密钥在 CBC 模式下使用 AES 加密数据。

PBKDF2 需要一个伪随机函数(PRF),这里使用的 PRF 是HMAC。HMAC 需要一个压缩(散列)函数,该函数是SHA-2,具有 256 位摘要大小(通常称为“SHA-256”)。

我不会说“这是 AES-256 位加密”。这是一个完整的加密系统,包括 AES-256 作为其组件之一。还有许多其他(并且更安全)的方法可以使用 AES 加密事物。例如,这似乎有一个静态 IV+Key(假设saltsecret是恒定的)。这是使用 CBC 模式的不安全方式。它还缺乏任何类型的身份验证,因此消息可能会在传输过程中被修改。这类缺陷很常见,但这不应被视为 AES-256 的典型示例。


推荐阅读