security - 如何在我的登录密码中添加盐?

标签 security hash password-protection salt

我想在我的登录系统中实现一个盐,但我对它应该如何工作有点困惑。我无法理解其背后的逻辑。我知道 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/

相关文章:

javascript - 如何防止客户端用户更改 onClick 函数中的参数?

security - 使用seteuid暂时放弃root权限是否有缺陷

ruby-on-rails - 更新嵌套哈希参数。更新 Action ,ruby on rails

c++ - 在一个字符串中搜索另一个字符串的变位词?

security - 具有用户选择密码的公钥加密?

asp.net - .Net SQL Server 连接字符串 - 对其他开发人员隐藏密码

database - 拆分数据库是合法的安全措施吗?

javascript - 可以使用纯文本文件进行身份验证吗?

asp.net - 将 asp.net 应用程序转换为使用 asp.net 表单例份验证 - SQL Server 中的密码散列

php - 密码保护页面?(具有数据库访问权限)