我听说盐不是要保密的,但如果我把它保密了呢?

信息安全 密码 哈希 php sql注入
2021-09-03 03:32:30

可能重复:
密码散列添加盐+胡椒还是盐足够?
如何储存盐?

好的,我最近一直在研究密码哈希。我有几个问题。因此,我将解释我所知道的(如果我在此过程中的任何地方出错,请纠正我,以便我可以学习),以便我可以向您展示我的困惑所在。

所以我想对我的用户密码进行哈希处理的原因是,如果黑客获得了数据库,他不能只使用他们的电子邮件并输入他们的密码来窃取他们的钱。它还使得任何管理员都看不到他们的密码是什么。所以底线是保证我的用户安全。

仅使用类似的哈希MD5是不够的,因为可以使用彩虹表立即找出他们的密码是什么,而快速计算机无论如何都可以破解这些密码,无论是否加盐。

但是在散列时使用盐是很重要的,以确保彩虹表不能被使用并迫使黑客不得不暴力破解他们的方式来找出密码。因此,当我们存储盐时,假设通过将其附加到散列中,<hash>_<salt>它是否为明文并不重要,因为黑客被迫暴力破解散列。

所以现在回答我的问题。

1. 为什么我不从我的代码中加密盐,然后将加密的盐存储在数据库中?

似乎如果我这样做了,那么黑客就不可能暴力破解并获取密码,因为他们会假设盐是明文,而实际上并非如此。所以他们会不断尝试,永远不会想出密码。但这引出了我的第二个问题。

2. 黑客在查看数据库时如何知道我使用了哪种哈希算法?

如果我使用 bcrypt 对密码进行哈希处理,然后使用 scrypt 对密码进行哈希处理,那么似乎能够弄清楚哈希顺序的唯一方法就是能够查看我的代码。


好的,为了更好地解释自己,让我们编一个场景。一个黑客使用某种形式的 SQL 注入来打印我的整个用户列表,得到 1000 行带有哈希密码的电子邮件。这些密码我附加了我的盐,它已经用我的密钥加密了,我的密钥只保存在代码中。黑客怎么会知道盐是加密的?如果他以某种方式发现它是加密的,除非他有密钥,否则他将无法解密盐。获得密钥的唯一方法是他可以访问我的代码。如果他可以访问我的代码,那么到那时,他会确切地看到我是如何对我的密码进行散列和加盐处理的,这样他就可以轻松地复制这个过程,无论他是否有我的密钥,然后开始暴力破解获取密码。所以看起来像加密盐这样的事情会阻止任何无法访问代码的黑客找出密码。这不是真的吗?如果不是,请给我详细解释。=D

1个回答

让我们假设黑客掌握了您的数据库。

让我们分析一下当您将加密的盐存储到数据库中时会发生什么。使用加密盐的散列函数将无法使用盐,直到它被解密。因此,您的代码将请求加密的盐,并且需要使用密钥解密。我们可以假设这个键在代码中。

由于黑客拥有您的数据库,因此他们将拥有加密的盐。现在他们真的只需要钥匙。在您的示例中,密钥存储在代码中。普通盐也将存储在代码中。 您实际上根本没有添加任何安全性,因为黑客可以通过从代码中获取密钥来简单地解密盐,就像他们必须从代码中获取盐一样。

大多数散列函数都会有足够的,以至于您无法分析字符串来确定使用了哪个散列函数。但是,您可以直观地看到不同的哈希包含不同数量和类型的字符,这将为您提供更好的线索来了解正在使用的字符。

如果黑客要获取您的数据库,那么获取您的代码可能同样容易。盐的目的是使它不会受到彩虹表攻击。当然,他们可以生成彩虹表,但这样做可能需要太多时间。