可能重复:
密码散列添加盐+胡椒还是盐足够?
如何储存盐?
好的,我最近一直在研究密码哈希。我有几个问题。因此,我将解释我所知道的(如果我在此过程中的任何地方出错,请纠正我,以便我可以学习),以便我可以向您展示我的困惑所在。
所以我想对我的用户密码进行哈希处理的原因是,如果黑客获得了数据库,他不能只使用他们的电子邮件并输入他们的密码来窃取他们的钱。它还使得任何管理员都看不到他们的密码是什么。所以底线是保证我的用户安全。
仅使用类似的哈希MD5是不够的,因为可以使用彩虹表立即找出他们的密码是什么,而快速计算机无论如何都可以破解这些密码,无论是否加盐。
但是在散列时使用盐是很重要的,以确保彩虹表不能被使用并迫使黑客不得不暴力破解他们的方式来找出密码。因此,当我们存储盐时,假设通过将其附加到散列中,<hash>_<salt>它是否为明文并不重要,因为黑客被迫暴力破解散列。
所以现在回答我的问题。
1. 为什么我不从我的代码中加密盐,然后将加密的盐存储在数据库中?
似乎如果我这样做了,那么黑客就不可能暴力破解并获取密码,因为他们会假设盐是明文,而实际上并非如此。所以他们会不断尝试,永远不会想出密码。但这引出了我的第二个问题。
2. 黑客在查看数据库时如何知道我使用了哪种哈希算法?
如果我使用 bcrypt 对密码进行哈希处理,然后使用 scrypt 对密码进行哈希处理,那么似乎能够弄清楚哈希顺序的唯一方法就是能够查看我的代码。
好的,为了更好地解释自己,让我们编一个场景。一个黑客使用某种形式的 SQL 注入来打印我的整个用户列表,得到 1000 行带有哈希密码的电子邮件。这些密码我附加了我的盐,它已经用我的密钥加密了,我的密钥只保存在代码中。黑客怎么会知道盐是加密的?如果他以某种方式发现它是加密的,除非他有密钥,否则他将无法解密盐。获得密钥的唯一方法是他可以访问我的代码。如果他可以访问我的代码,那么到那时,他会确切地看到我是如何对我的密码进行散列和加盐处理的,这样他就可以轻松地复制这个过程,无论他是否有我的密钥,然后开始暴力破解获取密码。所以看起来像加密盐这样的事情会阻止任何无法访问代码的黑客找出密码。这不是真的吗?如果不是,请给我详细解释。=D