【问题标题】:Is authentication required/recommended with a stream cipher?是否需要/推荐使用流密码进行身份验证?
【发布时间】:2009-10-21 16:01:15
【问题描述】:

我想使用共享密码/密钥来保护基于 TCP 的程序的通信。无需处理块大小、填充等的最简单方法是直接使用stream cipher。这样一来,明文和加密数据之间的数据量不会发生变化,而且修改也很简单。

仅使用流密码意味着没有身份验证,我一直认为/听说没有身份验证的加密不够安全,不应使用。

如果必须向流密码添加身份验证,我们将失去流密码添加的简单性,因为我们必须添加 HMAC 或使用经过身份验证的加密方法(如来自 NaCl 的crypto_secretbox),有最小消息长度,我们必须处理填充,...

你会推荐什么?在某些特定情况下只使用流密码而不进行身份验证是否安全?

【问题讨论】:

  • 这有点含糊。您要保护什么,以及针对什么攻击者?关于加密的一般建议:除非您真的必须这样做,并且除非您确切知道自己在做什么,否则不要自己动手。使用标准。在您的情况下,也许您可​​以使用 TLS (openssl)。甚至使用 SSH 隧道,让你的 TCP 流不加密。
  • 我可以推荐阅读 Cryptography for Developers 以了解有关此问题的更多信息:books.google.at/…

标签: authentication encryption stream-cipher


【解决方案1】:

使用某种消息验证器对于流密码尤其很重要,因为密文更改和明文更改之间的关系非常简单。

无论如何,您不能盲目地应用流密码而不向流添加任何额外信息 - 请记住流密码最重要的规则:

切勿重复使用相同的密钥流

因此,除非您只打算加密一个单个 连接,然后丢弃密码,否则您将需要从共享密钥为每个连接生成一个会话密钥。这意味着您将需要在连接开始时发送一些额外的信息,并且由于无论如何您都在发送,因此在每条消息之后发送 HMAC 应该没什么大不了的。

无论如何,因为看起来更简单而使用流密码通常是一个错误。您提到了来自 NaCl 的 crypto_secretbox - 我建议使用它,它会为您处理身份验证和填充问题。

【讨论】:

    【解决方案2】:

    您可以考虑在GCM-mode 中使用 AES。这将为您提供具有内置身份验证的流密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多