在SO处经历了关于此主题的几个问题,我无法找到此特定查询的答案。我见过 Salting Your Password: Best Practices?和Non-random salt for password hashes的优秀答案,两者都有非常有用的指导方针,但没有明确的存储准则。
建议在同一个表中使用散列,随机盐和迭代计数吗?如果没有,建议的方法是什么?
我知道即使我们将彩虹表放在一起,也无法使用随机盐制作彩虹表。问题是因为有许多简单的额外威慑可以走很长的路。例如,将盐放在不同的表中(注入通常是一个表,而不是数据库)和迭代计数在不同的层(例如,中间层中的常量)。
答案 0 :(得分:2)
我们已经在Security Stack Exchange上以各种形式回答了这个问题。
这些在概念上类似于将所有信息保存在同一个表中的方法。
@Greg的评论部分正确 - 一个坚定的攻击者最终将能够获得所有数据,但关键在于时间。技术娴熟的攻击者,只要有足够的时间和资源就可以访问您的系统 - 关键是要让它变得困难或嘈杂,以便及时发现它。
来自密码学家Thomas Pornin在我们的安全堆栈交换博客上的帖子之一:
答案 1 :(得分:2)
将salt和迭代计数与计算的哈希一起存储是正常的模式。
盐不是秘密。对于每个计算的哈希,盐“工作”是不同的。如果攻击者知道盐和迭代计数,它对他没有任何帮助。答案 2 :(得分:-2)
将盐存储在数据库中对于防止彩虹表攻击是好的,但是对于一个额外的威慑:
确保盐是上,下,字母,数字和特殊字符,并在数据库中使用盐进行硬编码:
sha1('a&1S' . $user_pass . $random_salt); // a&1S is the 'hard coded salt'
为什么使用硬编码盐? 它可以完成所有操作,而不仅仅是存储在数据库中的随机盐。
在大多数情况下攻击者首先拥有数据库访问权限,并且使用salt和hash,密码可以轻松破解,请参阅此答案的底部。 (该算法也必须是已知的,但如果攻击者可以在您的站点上注册,他们可以通过散列哈希,盐和密码来反转哈希算法)
因此,如果攻击者没有文件访问权限(大多数情况下),硬编码的盐将是未知的,攻击者破解密码的唯一方法就是暴力攻击(强制执行U,L,A,N ,S即 - 如果密码+盐+硬编码盐长度> = 10个字符,则接下来是不可能的)
请参阅http://hashcat.net - 推荐的哈希破解黑客工具 在http://waraxe.us上提交您的哈希,看看您的密码是否可以破解(: