现在我知道如何加盐和盐哈希密码,还有一些问题

时间:2014-01-08 00:19:36

标签: authentication hash passwords credentials salt

所以,我们假设我已经阅读了关于适当加盐和散列密码的每篇文章/帖子,以保护用户凭据。

这意味着我想知道要使用什么哈希算法(SHA1与SHA2对比PDKBF2),如何生成盐,如何存储盐,如何附加盐,或者我是否应该自己编写代码而不是像bcrypt那样利用完善的库。请尽量避免在这里讨论这些问题,因为我已经阅读了50多个其他页面。

请假设以下是我的方法(另请注意,我知道这对于金融服务等应用来说并不完美或可能已足够,我真的只是想知道这是否是一个可接受的最低标准,声称我“做正确的事” )。

  • 用户来到我神奇的网站(www.myamazingwebsite.com)并通过电子邮件和通行证登录。
  • 我从我的数据库中取出她的盐和哈希。假设salt足够长,每个用户都是唯一的,并且在用户注册时使用CSPRNG创建。
  • 我将salt添加到她的输入密码中,使用SHA-512哈希,运行1,000次迭代,然后将其与从db中提取的哈希值进行比较:

    var hash = sha512(salt + password);
    for (i = 0; i < 1000; i++) {
        hash = sha512(salt + password + hash);
    }
    
  • 如果匹配,则对用户进行身份验证。否则,他们不是。

现在,我的问题是我的上述方法有多安全。我想帮助回答的问题:

  1. 我是否需要定期更换盐?例如,也许我可以在每次成功登录后使用新创建的随机盐重新计算和存储新哈希。这似乎更安全,但我不确定这里的标准做法是什么。
  2. 对服务器的请求将通过https完成。这是否意味着我可以假设我可以处理所有哈希和验证逻辑服务器端?大多数人会认为这是足够的,还是我需要在客户端和服务器端考虑一些混合?
  3. 我忽视还是需要考虑的其他事情?
  4. 提前致谢,我感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

1)假设你做了正确的事并且没有存储他们的密码,除非他们登录,否则你不能更改盐。我想你每次登录时都可以更换盐,但它不会真的有帮助(可能会受伤)。

原因如下:对每个人都有一个独特的盐只会让有权访问您数据库的攻击者更难以猜测密码。如果你做得对,他就不得不为每个人使用不同的盐。他不能只是开始使用网站范围的盐来猜测密码,看看它是否与任何人匹配。只要您为每个用户提供独特的盐,您就可以尽力而为。

事实上,更改salt只会让攻击者随着时间的推移访问您的数据库更多信息。现在他知道他们的密码看起来像两种不同的方式。这(理论上)可以帮助破解它。出于这个原因,实际上建议改变盐。

2)Https就足够了。如果有人可以破坏https,那么任何额外的客户端哈希等都无济于事。客户端计算机受到了损害。

3)我认为您对最佳密码实践有一个公平的理解。不要忽视其他安全问题,如sql-injection和跨站点脚本。

答案 1 :(得分:1)

  

我是否需要定期更换盐?

没有。 salt是每用户公共参数,用于两个目的。首先,它确保攻击者无法构建哈希密码的脱机字典。其次,它确保具有相同密码的两个用户在数据库中具有不同的散列密码条目。

请参阅OWASP的John Steven的Secure Password Storage Cheat SheetSecure Password Storage paper。它将引导您完成整个威胁模型,并解释为什么事情以特定方式完成。

  

对服务器的请求将通过https完成。这是否意味着我可以假设我可以处理所有哈希和验证逻辑服务器端?

这是标准做法,但这是一个坏主意。由于SSL / TLS和PKI在实践中存在的所有问题,这是个坏主意。虽然这很常见,但它是如何失败的:SSL / TLS通道是在任何提供证书的服务器上设置的。然后,Web应用程序使用basic_auth方案将{username,password}放在纯文本中。现在这个坏人有了用户名和密码。

以这种方式做事还有很多其他问题。 Peter Gutmann在他的Engineering Security书中谈到了这个问题(以及更多)。他有一种诙谐的幽默感,所以这本书有时也非常好笑,即使它是一本技术书。

  

大多数人会认为这是否足够,或者我是否需要考虑客户端和服务器端的混合?

如果可能,请使用TLS-PSK(预共享密钥)或TLS-SRP(安全远程密码)。两者都克服了basic_auth方案的问题,既妥善绑定了通道,又提供了相互认证。 TLS-PSK和TLS-SRP共有80个密码套件,因此不乏算法。

  

我忽视还是需要考虑的其他事情?

裂缝并不是唯一的威胁。更有可能的是,那个试图闯入你的组织的人将会使用从Adobe漏洞收集的数百万个密码中的顶级密码,LinkedIn漏洞,Last.fm漏洞,&lt;最喜欢的&gt;违反....例如:

如果您拥有数千个最受欢迎的密码列表,为什么还要打扰暴力?

因此,第一最佳防御措施是使用过滤用户错误密码选项的单词列表。也就是说,不要让用户首先选择弱密码或已知密码。

如果有人擅离使用您的密码数据库,那么他或她将使用相同的密码列表来尝试猜测您的用户密码。他或她可能甚至不会打扰暴力强迫因为他或她将使用密码列表恢复如此多的密码。

据我了解,这些单词列表在实现为Bloom Filter时非常小。它们的大小只有KB,即使有数百万个密码。请参阅Peter Gutmann的Engineering Security进行深入讨论。