散列与“单向加密”

信息安全 密码管理
2021-09-04 22:57:51

在开发网站应用程序时,我和一个朋友询问了一位安全专家(在 IBM 工作)如何处理存储密码。经过数小时的谷歌搜索(导致对 security.stackexchange.com 进行数小时的探索),我确定在数据库中拥有一个带有 salt 的用户数据库是安全的,只要它是每个用户的 salt 和慢速哈希算法。

安全专家说,如果数据库被入侵,一切都会被入侵,这是真的。他建议“单向加密”,这......我真的不明白。根据定义,散列不是一种方式,而根据定义,加密不是吗?

如果有人能澄清这一点,那就太好了。

3个回答

你是对的。散列是不可逆的,而加密是。安全专家正在通过他的帽子说话。

cpast 所说的“胡椒”是键控散列的键。在这种情况下,哈希算法的输入包含三个组件:密码、盐和密钥。如果数据库被破坏,盐就会被破坏,但密钥不会被破坏。如果密钥具有非平凡长度,例如 128 位,则仅从哈希和盐中恢复密码可能是不可能的。(严格来说,这是一个“棘手的”问题。一个人知道如何去做——尝试所有可能的关键值——只是无法在合理的时间内完成。)

我想术语“单向加密”可以追溯到没有加密散列函数可用的时代,因此要在 Unix 系统上获取密码散列,例如使用加密函数 ( DES )。但是,为了提供固定密钥来加密密码(此算法的正常使用,但允许使用相同的密钥解密密码),密码本身既用作密钥又用作要加密的数据。

通过这种方式,实现了单向加密,因为在不知道密码的情况下无法解密密码。

后来,随着时间的推移,包括高素质数学家和知名安全工程师在内的很多人都在研究这个主题,并为我们提供了更好的工具来满足各种需求(这里:密码哈希函数)。因此,现在没有人应该尝试修改现有算法以以不适当的方式使用它们(加密用于加密文本,而不是产生哈希)。

在标准的技术人员谈话中,“单向加密”意味着散列。尽管从技术上讲,散列是与加密不同的操作,但它们都是“加密原语”,并且将所有加密称为加密是很常见的(尽管在技术上是不正确的)。在这一点上与你的同事学究起来不太可能为你赢得任何朋友。在与不是安全专家的人交谈时,我通常使用“单向加密”一词,因为它被更广泛地理解。

顺便说一句,可以将任何块散列操作变成对称密码,将任何对称密码变成块散列操作。Wikipedia上有一些信息,Bruce Schneier 在他的“应用密码学”一书中更详细地讨论了这一点。