【问题标题】:Encryption or hashing加密或散列
【发布时间】:2020-10-14 19:00:31
【问题描述】:

我在网上有一个功能说这是 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 是一种散列/加密吗?

【问题讨论】:

  • 安全警告 - 此代码使用静态 IV 进行完全加密 UNSECURE。请使用随机 IV,请使用 GCM 模式进行身份验证。
  • 这是我对基于密码的加密问题的回答的损坏副本。那里的评论应该回答您的问题以及恢复安全所需的部分并解释更好模式的选项等。
  • 你的问题没有多大意义。 AES 提供机密性,SHA-256 通过散列提供密钥派生。它们一起构成了一个密码系统。除了密钥派生之外,还可以使用 HMAC-SHA-256 通过构建流式密码来进行加密(机密性),并且可以通过使用 CMAC 来使用 AES 进行真实性。然后他们将组成一个不同的密码系统。
  • 我有一些examples。有用于密文认证的HMAC(完整性检查)

标签: java encryption aes


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我将代码分成几个部分:

        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);
    

    永远不要在重用同一个键时使用静态 IV。使用相同的 IV 和密钥进行加密可以(并且在许多情况下将)提供揭示某些数据或完全破坏加密的方法。 IV 旨在确保重复使用相同的加密密钥是安全的,对于 CBC 模式,IV 需要不仅仅是随机的,它必须是不可预测的。

    在没有深入了解的情况下复制/粘贴代码时,使用静态 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");
         
    

    加密密钥需要具有特定长度(AES-256 需要 256 位),并且密钥应该具有高熵(高随机性)。

    人类密码的长度往往不同,而且密码的随机性要小得多。这段代码(如另一个答案中所述)使用包含 SHA-256 散列的 65536 轮从密码创建密钥。

    多轮用于减慢密钥生成速度,试图降低暴力破解的可行性。

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
    

    这就是加密本身。所以整个例子是提供加密。散列仅用作“密钥拉伸”算法的一部分 - 从密码创建加密密钥。

    此示例不提供任何身份验证 - 密文可能被篡改,您无法验证完整性。

    【讨论】:

    • 另外,还有一个合成初始化向量 (SIV) 模式,如 nonce-misuse resistance
    • @kelalaka 哦,它已经在 RFC 中了 (rfc8452) :) 很好,谢谢参考
    【解决方案3】:

    不要使用此代码;它不安全。 It is based on one of my answers, 但在此过程中,更改了关键元素,破坏了其完整性。

    好的,让我们再试一次。

    现在,这是使用 HMAC-SHA256。

    不,它使用的是 PBKDF2。 PBKDF2 反过来可以使用 HMAC,而 HMAC 又可以使用 SHA-256。

    PBKDF2 是一种密钥派生算法。它将文本密码转换为与对称密码一起使用的实际密钥。它的设计部分是为了限制可以将不同密码作为密钥进行测试的速率。它击败了字典攻击。

    那么这实际上是 AES 还是 Hashing?

    两者兼而有之。两者都不。它是一个基于密码的加密系统,使用密码和密钥派生算法。如前所述,此密钥派生使用多种算法,包括哈希算法。

    还是仅使用 HMAC 对密钥进行哈希处理?

    不仅仅是散列秘密。 HMAC 使用散列算法,但它还指定了秘密、消息的填充以及散列如何链接在一起。您可以read more 了解它。 HMAC 只是充当 PBKDF2 的一部分的伪随机函数 (PRF),它添加了其他元素,例如 PRF 与秘密、盐和计数器的迭代,以努力保持秘密的熵,同时需要可调整的计算量。你也可以read more about it

    我的意思是 SHA-256 是一种散列算法?

    是的。但是这里没有直接在顶层使用。它是一个嵌套在顶级 PBKDF2 算法中的组件。

    另外,它可能听起来很基础,但 HMAC 是散列/加密吗?

    没有。从根本上说,它是一个消息验证码。它可用于检测数据的更改。但在这里,它被用作 PRF 来生成一个没有秘密的人无法预测的数据流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2017-05-15
      • 1970-01-01
      • 2011-06-23
      • 2018-01-20
      • 2013-03-13
      • 2013-01-08
      相关资源
      最近更新 更多