【问题标题】:Using SHA-1 hash as AES key使用 SHA-1 哈希作为 AES 密钥
【发布时间】:2013-11-20 16:15:32
【问题描述】:

假设我想将“密码派生字节”作为 AES 密钥。 例如,我有一个密码“topsecret”,我确实为它计算了 SHA-1 哈希(160 位),我想将这些字节作为 AES-128 的密钥提供。

我应该在 128 位后截断还是进行某种折叠? AES-256 怎么样?我应该重复字节,用 0 填充还是做一些“展开”操作?

我知道在后一种情况下,安全性保持在 160 位,因为 256 位密码池减少到 2^160 种可能的组合,但我只是想克服技术限制(没有 AES-160)。

什么理论说的? (不,对 128 位使用 MD5,对 256 位长散列使用 SHA-256 不是一种选择)

【问题讨论】:

  • 这里要明确一点(与 ntoskml 相呼应),您的安全性绝不是 160 位。获取错误密码的哈希值并不能提高安全性 - 攻击者还可以获取字典中每个单词的哈希值。
  • @andrewcooke:你是对的,我知道这一点。我本来可以更精确的。我的意思是 SHA-1 将安全性限制为 160 位。不管我使用 SHA-1 的密码有多强,都会将其安全性限制为 最大 160 位。
  • pbkdf 将根据需要为您提供尽可能多的字节。纯粹出于“教育目的”,如果您的密码超过 160 位熵,您可以通过执行 sha1(password) + sha1(byte(0)+password) 并从中获取 256 位来生成一个保留该密码的密钥。在第二种情况下,您可以在密码中添加任何内容。虽然我必须承认我对此没有参考,但您可以从以下事实中看出这个想法:更改密码中的任何位都有 50% 的机会独立更改 256 位中的任何位。
  • (当然,假设哈希是正确的)
  • 请注意,您需要 大量 的熵用于密钥。例如,56 位 DES 密钥几乎毫无价值,因为它们可以在 20 小时内使用当前硬件进行暴力破解。使用密码时,情况很糟糕——通过 SHA-1 运行一个 1000 万字的字典,在家用计算机上尝试每个键只需要几秒钟。这就是为什么基于密码的加密采用不同的方法使密钥派生过程变得昂贵。

标签: encryption hash language-agnostic cryptography


【解决方案1】:

一个典型的密码只有几十位熵,通过哈希函数运行密码不会增加任何熵。因此,此类密钥很容易使用字典或蛮力攻击。

最普遍接受的解决方案是使散列函数非常慢。为此设计的算法称为“基于密码的密钥派生函数”。 PBKDF2 和 bcrypt 是最受欢迎的。

【讨论】:

    【解决方案2】:

    理论说没关系。您可以用 0 填充,可以通过重复填充等。结果中的熵量是相同的 - 暴力破解同样困难。

    至于将其截断为 128 位,您如何截断它并不重要 - 散列输出的所有字节通常被认为是同样随机且不相关的。没有“更多熵”的一面之类的。

    所以,从技术上讲,随心所欲 - 你的密码和密码一样强大。

    【讨论】:

    • 由于答案完全正确,另一个确实提供了有关 PBKDF2 的提示,我必须选择一个。所以我接受 ntoskml 的。
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多