为什么用多个散列函数对密码进行散列是无用的?

信息安全 密码 哈希
2021-08-28 07:42:43

我在网上读到,在将密码存储在数据库中之前,用多种散列算法(而不仅仅是一个)对密码进行散列是没有用的,而且基本上是不切实际的。我真的不明白为什么会这样。如果有人拿到了哈希列表,但他不知道使用了哪些哈希函数,那么如何破解密码?似乎使用多个哈希函数的组合会使密码更安全......但显然他们没有。为什么不?

我特指这篇博文中标题为“双散列和古怪散列函数”的部分。

3个回答

假设始终是,任何攻击者都会知道所使用的软件,包括使用哪个散列等配置。这种知识总是存在泄露的风险,因此即使知道其来源,强大的系统也必须是安全的。(也许攻击者购买了相同的软件)另外,如果攻击者以某种方式只获得了一个密码和相应的散列,则相对容易找出一组似是而非的散列函数中的哪一个产生了该散列。

至于同时对一个密码使用多个哈希,问题在于它通常可以通过只专注于最弱或最容易计算的哈希(由攻击者选择)来暴力破解哈希。

没有链接,所以我当然不知道你指的是什么情况。

请参阅这个相关问题,了解为什么组合多个哈希函数是个坏主意。

如果有人拿到了哈希列表,但他不知道哈希函数是什么,那么如何破解密码?

似乎您想防御攻击者访问您的数据库而不是您的源代码的情况。不过,堆叠多个已知的散列函数并不是一个好的方法。

如果攻击者可以自己注册一个帐户,他们将拥有密码和哈希的组合,从而很容易猜测所使用的哈希函数。即使他们没有这个,暴力破解你使用的哈希函数的组合也可能很容易。

所以你实际上并没有通过组合一些众所周知的哈希函数来获得任何东西,而从头开始编写自己的哈希函数显然是一个坏主意。

如果你想从你的代码库而不是数据库中获得额外的秘密,你可以考虑添加一个Pepper,它不仅比组合散列函数更安全,而且更容易维护一些自定义(组合)散列函数。

它可能不是完全没用,但也许它有点太接近两个非常糟糕的想法——即通过默默无闻的安全性和滚动你自己的加密货币。

Ilkkachu 上面提到我们假设攻击者知道具体的实现(Kerckhoff 原理)。如果不是这种情况,那么我们很想依赖我们实现的细节来确保安全,这会产生一个额外的弱点。其次,任何超出专家设计标准的东西都是有风险的,因为很难确定你没有添加任何漏洞。