为什么密码在用于加密之前要进行哈希处理?

信息安全 加密 密码 哈希
2021-09-02 12:31:09

在阅读有关产品安全性的一些文档时,我发现供应商使用密码的 SHA-2 来加密数据(AES-256),而不是直接使用此密码。

这样做有什么好处吗?

攻击者不会使用此 SHA-2-as-a-password 密钥来破解加密数据,而是会耗尽密码密钥空间(如果可行)并尝试其哈希。因此我能想到的唯一原因是有一个额外的计算步骤(哈希的创建)。如果要在计算上使攻击复杂化,我宁愿增加密码熵。

4个回答

这听起来像是密钥派生函数 (KDF)的原始版本,特别是他们可能可以避免使用PBKDF2重新发明轮子。

您不想将密码直接用作 AES 密钥的原因有很多。

  1. 分发位。这里的主要属性是散列函数的输出,从统计学上讲,是均匀分布的。人们倾向于选择不完全随机的密码,特别是大多数密码只包含您可以在键盘上键入的字符。当用作加密密钥时,非统计随机密钥可能会暴露加密功能的弱点。

  2. 使密钥适合加密密钥长度。大多数密码将比加密函数的密钥空间长或短。通过散列您的密码,确切的密钥长度将与您的加密函数的输入密钥的大小完全相同。虽然派生密钥的熵不会增加,但如果您只是简单地将密码填零或更糟糕的是截断密码,这可以避免暴露加密函数中的弱点的可能性。

  3. 减慢密钥派生解密速度。根据您的描述,该软件仅使用单轮 SHA256,数量不多。但是使用正确的基于密码的 KDF,如 PBKDF2,通常有数万或数十万轮的底层哈希函数。这会减慢计算密钥的速度,在不增加密码长度的情况下增加密码的有效强度。

  4. 将用户的纯文本密码保留在内存之外,从而防止在休眠或故障转储期间将其意外转储到磁盘。虽然这不会保护哈希不被用于解密您正在加密的数据,但它会阻止密码被重新用于解密其他文件(可能使用不同的盐)或在您的在线帐户或其他设备上尝试你用。

SHA-256将从任意长度的密码生成 256 位哈希。这个哈希在技术上(因为它的长度是正确的)可以用作AES-256.

如果没有更多上下文,我猜他们采用了最简单的方法来生成 256 位密钥。

正如您所提到的,这里的弱点是密码,单个SHA-256密码太便宜,无法防止对密码的暴力攻击。

相反,应该使用基于密码的密钥派生函数 (PBKDF)。也不应该直接使用密钥,而是使用它来加密使用更好的 CSPRNG 生成的密钥。

您可以在https://crypto.stackexchange.com/questions/22678/how-secure-is-it-to-use-password-as-aes-key中找到关于此主题的非常好的讨论

没有任何上下文,很难回答。这可能只是一种简单的密码扩展机制,也可能是其他东西。例如,另一方可能需要解密数据并因此存储必要的密钥。

通过使用散列,它将为原始用户的密码提供某种程度的保护。请注意,不多,但仍然比简单地存储密码本身要好得多。

我认为 SHA-256 密码的主要原因很简单。你不想知道密码。如果您知道密码,则需要采取一些额外的预防措施以妥善保护它。由于违规可能会暴露密码,因此可能会导致其他攻击。

此外,通常该软件不使用密码本身来生成哈希,但通常会添加一些随机垃圾,以确保选择“Pa55w0rd”的 2 个用户不会出现相同的哈希。

这种添加的盐使得攻击者很难猜出密码,即使他可以访问最终的哈希值。那里有简单的 SHA-256 操作的预计算结果,它们已经覆盖了大量的正常密钥空间(称为彩虹表)这些可用于查找与帐户相关的密码。但是,如果您在密码的 fromt 中添加几个字节的随机垃圾,这些表就会严重失败,而且它们更没用,因为每个用户都有自己的“随机垃圾”

唯一的“缺点”是您无法恢复密码,只能重置密码。(我讨厌可以向我发送密码的在线服务,因为这表明他们不在乎)

正如其他人提到的那样,这会产生一个方便的 256 位数据块,可以用作 256 AES 密钥。这也意味着密码重置将使所有加密数据无效(您可能需要取决于数据)