我想在我的登录系统中实现一个盐,但我对它应该如何工作有点困惑。我无法理解其背后的逻辑。我知道 md5 是一种单向算法,我遇到的所有函数似乎都将所有内容散列在一起。如果是这种情况,如何取回密码进行比较呢?我最大的问题是,对用户密码加盐如何比仅对密码进行哈希处理更安全?如果数据库遭到破坏,哈希值和盐都在数据库中。这不正是黑客所需要的吗?
我还发现了另一篇关于 SO 的帖子,其中另一位开发人员说:
"Ensure your salt and algorithm are stored separately from the database"
我想将盐存储在数据库中。如果我这样做真的有问题吗?
我正在寻求一些帮助来了解其工作原理以及最佳实践可能是什么。非常感谢任何帮助。
<小时/>编辑: 我要感谢大家的回应和想法。尽管我现在可能更加困惑,但这对我来说无疑是一次学习经历。再次感谢大家。
最佳答案
盐的目的是防止攻击者通过预先计算的 rainbow tables 分摊跨站点的暴力攻击成本(或者更好的是,当为每个用户使用不同的盐时:站点的所有用户) 。
通过简单的散列,攻击者可以计算一次这样的表(一个非常长且成本高昂的操作),然后使用它来快速查找任何站点的密码。当站点使用一种固定盐时,攻击者必须专门为该站点计算一个新表。当网站为每个用户使用不同的盐时,攻击者可以不再费心使用彩虹表 - 他将不得不单独暴力破解每个密码。
无需单独储存盐即可获得此优势。理论上它会更安全,因为它可以弥补字典或短密码的弱点。实际上,这并不值得打扰,因为最终您需要在某处访问盐来检查密码。此外,尝试将它们分开会导致系统更加复杂 - 系统越复杂,出现安全漏洞的机会就越多。
编辑:我的具体建议:
- 为每个用户生成长伪随机盐并存储在数据库中
- 使用基于 bcrypt 的哈希
- 理想情况下,不要自己实现它,使用 existing library相反
关于security - 如何在我的登录密码中添加盐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2188507/