【问题标题】:Can I use PBKDF2 to generate an AES256 key to encrypt and implicitly authenticate?我可以使用 PBKDF2 生成 AES256 密钥来加密和隐式身份验证吗?
【发布时间】:2011-05-18 05:45:40
【问题描述】:

我有 2 台设备,我想在它们之间建立一个安全的通信通道。唯一的共享密钥是(7 到 20 个字符的 ASCII)密码。如果我使用 PBKDF2(来自 RFC 2898)和普通盐、迭代和密码来在双方生成 AES256-CBC 密钥和 IV,我想我可以一步验证用户并提供加密通道。这是真的吗,还是我只看到人们使用 PBKDF2 来验证密码有什么原因?

我的理由是双方都需要知道密码才能生成相同的密钥和 IV。因此,如果设备 B 可以解密来自设备 A 的数据,则它们都已证明它们具有相同的密码。

【问题讨论】:

    标签: security encryption cryptography


    【解决方案1】:

    PBKDF2 是一种从共享密钥生成公共密钥的好方法(但您不应该以这种方式生成 IV - IV 应该是随机的,并与密文一起发送)。

    但是,CBC 不是身份验证密码模式。这是因为攻击者可以获取加密消息并对其进行可预测的修改,而无需能够读取消息或知道密钥。过去,此类攻击已经破坏了现实世界的系统。

    您可以使用验证密码模式,例如伽罗瓦计数器模式 (GCM) 而不是 CBC。

    另一种方法是 Encrypt-Then-MAC。使用 PBKDF2 和两种不同的盐来生成两个不同的密钥 - 首先使用 CBC 和第一个密钥对数据进行加密,然后使用第二个密钥在密文上计算 HMAC。

    您还需要使用一次性随机数来防止重放攻击。

    【讨论】:

      【解决方案2】:

      caf 的回答很好。我只想补充一点,您正在尝试实施加密,即使对于训练有素的专家,通常也是 bad idea。使用最高级别的库是非常安全的。

      【讨论】:

      • 您应该将其作为评论添加到咖啡馆的回答中
      【解决方案3】:

      PBKDF2 不“验证密码”。它从密码生成密钥。

      要验证密码,通常你有一个用密钥加密的东西。密钥是通过 PBKDF2 从原始密码生成的。然后保存密文。

      当您想检查用户输入的文本是否与密码匹配时,请使用 PBKDF2 从候选密码生成密钥,然后尝试解密保存的密文。如果解密有效,那么您就有了匹配项。

      不过,通常情况下,您不会将基于密码的密钥用作session key

      所以,不,您通常不会使用基于密码的密钥来保护安全通道。

      【讨论】:

        【解决方案4】:

        通常,您无法使用密码对消息进行身份验证,因为该消息可以是任何东西。但是,如果消息符合某种指定的格式,我认为可以合理地假设密文必须是使用共享密钥生成的——更长的消息以更复杂的格式提供更好的保证。例如,分组密码中的填充可以用作弱身份验证。

        为了更好的安全性,使用共享密钥计算 MAC 并将其与密文一起发送。

        虽然 PBKDF2 可用于生成 IV,但它只能针对单个消息执行此操作。在大多数情况下,最好选择一个随机 IV 并将其与密文一起发送。

        【讨论】:

        • 我将加密一个基于文本的协议,因此我将能够判断消息已正确解密。感谢您的提示!
        猜你喜欢
        • 2014-11-22
        • 2016-07-29
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 2021-01-25
        • 2017-10-24
        • 2010-11-04
        • 2017-12-26
        相关资源
        最近更新 更多