如果我做SALT随机为每个用户,我该如何验证他们的身份?(If I make the SALT ra

2019-08-05 15:04发布

我一直在阅读了关于盐析和哈希密码的好处,但有一点仍然逃避我...

当我为每个用户提供随机的盐,我怎么那么知道盐是什么,当我试图验证他们的身份登录?

所以,如果我做的..

HASHPW = PW.RANDOMNUMBER

我可以存储在数据库中的随机数,但似乎杀死添加盐的全部要点..不是吗? 我还可以使用非随机数为每个盐,但随后也杀死盐的点,因为如果他们弄清楚他们有我的所有用户的密码...

我刚开始学习PHP和MySQL和抽象的东西像这样一直困惑我

谢谢!

Answer 1:

它没有打败独特的盐的目的来存储它。 独特的盐的一点是要保护你的整个用户免受攻击,而不是某一个人用户信息库。 如果攻击者危及您的数据库,并确定足以破解特定用户的账号,他们会的。 没有什么我们可以做这件事。 但他们将不得不花费电脑的时间这样做了过多-以至于它不会花那么多时间上的每个用户是可行的-从而保护您的所有用户。 使用相同的盐为所有用户对比这 - 一旦攻击者的盐,同表/过程可以在相对短的时间内重新运行针对每一个用户。



Answer 2:

盐随机为每个用户生成的,但它的地方保存在数据库中。 您查找特定用户的盐,并用它来验证用户。

问题的关键是,因为盐是不同的每个用户,您不能使用散列的预建词典的散列密码映射到明文( 彩虹攻击 )。



Answer 3:

盐可以防止因您的加密密码数据库的副本,并安装在同一时间对所有的密码的脱机攻击别人。 它不会阻止针对单个密码攻击。

你可能会喜欢读原来的Unix口令安全性的文章。 它做了很好的工作说明盐是什么,以及为什么我们有他们: http://portal.acm.org/citation.cfm?id=359172



Answer 4:

创建哈希密码时,你应该使用“双规”盐

创建盐(随机MD5或SHA-1),然后使用格式类似SHA1(“ - $密码 - $ salt--”),然后储存哈希密码和盐的数据库。

然后,进行身份验证时,你重新创建哈希 - $通 - $ salt--字符串,并将其与存储在数据库通。



Answer 5:

你并不需要一个单独的盐,每一个密码。

腌制的目的是抵御彩虹表 - 你转换候选密码到有你的盐是一个新的字符串; 因为盐是一些私人字符串只有你拥有,知道盐渍密码的哈希将不利于谁拥有工厂彩虹表的运行攻击者。

一个聪明的攻击者可以通过创建一个帐户,并改变他的口令,观察结果散列就是建立一个定制的彩虹表只是为你服务。 如果盐是每个用户相同的,那么当他看到散“XYZ123”对应于“苹果”,并且注意其他用户的哈希值也是“XYZ123”,他可以断定,该用户的密码是“苹果”。 这是大多数人决定为每个用户存储一个唯一的盐的地步。

然而, 这是不必要的 。 您已经有每个用户的唯一的字符串 - 用户名。 这不是秘密,所以它不是一个很好的盐; 然而,用户名的级联和一个全球性的秘密盐既是秘密的和独特的。 如果存储(用户名+盐+密码)的哈希值,你只需要知道在查找时间全球唯一的盐值。

(这是真的,如果有人泄露了单一的全球盐,这会带来更大的风险,但它是值得考虑的技术)。



文章来源: If I make the SALT random for each user, how do I authenticate them?