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

时间:2016-12-02 04:38:54

标签: security encryption cryptography

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

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

1 个答案:

答案 0 :(得分:8)

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

Salting密码很大程度上可以防止彩虹表攻击。

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

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

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

如果网站没有使用salt,则这些表中将存在密码为8-9个字符或更少的所有用户的密码,如果攻击者获得对网站密码数据库的访问权限,则可以轻易地进行反转。

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

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

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

This文章很好地介绍了这个主题。