【发布时间】:2011-09-07 12:29:33
【问题描述】:
我在 SO(以及在我尝试进一步研究后在 Google 上找到的其他网站)上读到,将密码存储在数据库中的正确安全方法是存储 a密码。最重要的是,每个用户的盐应该是不同的,这样即使他们有加密的值,黑客也不会造成伤害。
我不太清楚加盐是什么意思。根据我的理解,您对密码进行哈希处理,然后使用哈希处理的另一个值(盐)并将这两者结合在一起,因此每个用户检索原始密码的算法都不同。
所以基本上,我要做的是对密码进行哈希处理,然后对每个用户的不同值使用不同的哈希值(即:用户名或电子邮件地址),然后我可以对这两个值来获取编码的密码。
这是正确的,还是我只是对密码哈希 + 加盐一无所知?
一个简单的解释或示例会很有帮助,因为我发现的网站并不能清楚地解释什么是加盐密码。
编辑:在阅读了到目前为止留下的 cmets 和答案后,我明白我并没有真正理解什么是盐,因为我遗漏了一些关键概念并且我做出了错误的假设。
我想知道的是:如果它是随机生成的,您如何始终获得相同的盐?如果盐像某些人提到的那样存储在数据库中,那么我可以看到您如何不断获得相同的盐,但这带来了另一个问题:如果有权访问数据库的任何人都可以访问,它如何使密码更安全?盐?难道他们不能只是将(已知的)盐附加到他们尝试的所有密码中,结果会与根本没有一个相同(除了一些小的时间损失)吗?
【问题讨论】:
-
我在查看 Google 时阅读了第一篇文章,但无法弄清楚它们是如何以一致的方式生成随机位的(如果它是随机的,那么当您尝试对 salt 进行身份验证时)不会相同,因此它不起作用)。那是我不太明白的,我认为这些位一定是从其他地方生成的。
-
相关,但不是直接的答案:现在用于安全存储密码的常用方法是使用 bcrypt en.wikipedia.org/wiki/Bcrypt,它使用公共盐存储密码。安全性在于加密密码的速度很慢,因此暴力攻击更加耗时。