是否存在足够安全的散列算法来在没有盐的情况下散列密码?

Yad*_*ood 0 security encryption cryptography

例如,SHA-1是否足够安全,无需验证用户密码?

或者我们总是需要盐来预防攻击?

小智 8

一般的共识是,无论散列函数如何都应该使用盐,它很容易做到,并使攻击数量级更难.现代安全最佳实践鼓励假设您的基础架构的任何部分可能(或已经)被破坏,要求系统的所有其他组件都要加强,以限制攻击者可以做的损害.

Salting密码很大程度上防止了彩虹表攻击.

彩虹表是可能的密码列表(可以从字符的可能组合中枚举,或者从字典构建),这些密码通过散列运行,密码与其生成的散列一起存储.

使用彩虹表的攻击者会将从其目标恢复的哈希与其预先计算的列表进行比较,以找到导致匹配哈希的密码.

预先计算的彩虹表是免费提供的.http://project-rainbowcrack.com/table.htm例如.使用大写和小写字母,数字和公共符号为1-8位数字密码提供SHA1表,或为字母数字组合提供1-9位数字.

如果站点不使用salt,则这些表中将存在密码为8-9个字符或更少的所有用户的密码,并且如果攻击者获得对站点密码数据库的访问权限,则可以简单地反转.

添加盐会增加进入散列函数的数据的复杂性,大大增加了构建有用的彩虹表所需的预计算工作量.

单独的SHA1不是散列密码的理想算法,设计的散列函数很快,因此它们可用于生成索引.这也使它们有效地生成彩虹表.通常使用多轮散列来使其更难(例如,对密码进行散列,并重复散列1000次结果).存在用于导出用于存储密码的密钥的现有标准,例如PBKDF2.

最后,我会考虑建立自己的机制来保护用户凭据作为绝对的最后手段.大多数语言都有现有的库,可以实现良好的可靠可靠解决方

文章涵盖了主题很好.

  • 这是一个非常好的答案.最重要的是,为了存储密码,应该使用PBKDF2(或Bcrypt),而不是像sha2这样的普通哈希,为此目的不再被认为是安全的,即使使用盐也是如此. (2认同)