散列密码的最佳做法
我想知道使用哪种方法在数据库中存储密码。 我使用MD5实现了它,但根据一些post,SHA1更安全。 还有其他更安全的方法吗? 请帮我找出保护密码的最佳方法。
当然SHA1比MD5更安全,但是对于大多数用途来说它不够安全。
您可能会发现有用的video如何不通过Computerphile存储密码 – 9分24秒。
您必须意识到在身份validation和访问控制方面需要考虑很多因素,因此使用良好的哈希方案是不够的。
关于存储密码。
如您所知,您不存储密码。 实际上,在存储密码时,一般而言,您希望使用为此目的而优化的现代算法来存储密码的盐渍哈希值。 对于salt,可以将其与散列一起存储,因为salt值尽可能长地使用随机值。
注意 :出于安全目的生成随机值时,请使用加密安全生成器(例如, RandomNumberGenerator for .NET的子类 – 示例 )。 这个随机数发生器的设计很难预测。 虽然标准随机数生成器是可重复的(即使用System.Random,您只需要生成所有值的种子,并且猜测种子所需的是使用相同种子生成的足够的连续值)。
另请注意 :大多数哈希都经过优化,可以快速计算,在该类别中同时包含MD5和SHA1。 您应该选择一个不那么快的攻击,以便在尝试破解密码时攻击将花费合理的时间来计算哈希值。
一个这样的算法是BCrypt – 其他包括Scrypt和PBKDF2 – 在使用来自C#的BCrypt时你会发现文章使用BCrypt来哈希你的密码:C#和SQL Server的例子很有用。 如果您无法为BCrypt或类似算法提供资源,则应至少使用SHA2的变体(SHA256,SHA512等)。
附录 :您可以使用BLC中提供的HMACSHA256
类作为密钥派生函数,将盐作为密钥传递。 这是优选的附加或预先添加盐(可能落入长度延伸攻击 )。 也就是说,如果您使用HMAC,并且您的哈希算法对于长度扩展攻击(已知或将要发现)是有趣的,那么您的系统是安全的。 MD5,SHA1和SHA2易受这种攻击。 SHA3不是。 遗憾的是,SHA3不包含在BLC中(不,它不是SHA384),您可以从Multiformats.Hash
或HashLib
获取它。 我必须提到SHA3在硬件中实现时也设计得很快。 请记住, 对于密码,慢哈希更好 。
附录:Argon2
正如一年前指出的那样,应该更新这个答案以提及Argon2 。 在此之前我确实写了原始答案。
当时,我还没有找到我愿意推荐的C#实现。 由于这个答案引起了我的注意,我又看了一眼,现在已经不是这样了。
您可以使用具有完全托管代码的Isopoh.Cryptography.Argon2
(它不是C ++实现的C#绑定,但是完整的C#代码),适用于所有主要平台,并且有可用的Nugets。
备注 :
- 使用
Argon2Version.Nineteen
。 这是Argon2 v.1.3(Nineteen = 0x13
),它修复了已知的漏洞。 - 使用
Argon2Type.DataDependentAddressin
(Argon2d),或使用带有TimeCost >= 10
Argon2Type.DataIndependentAddressing
(Argon2i)。 理论上,Argon2d容易受到侧通道攻击,因此建议不要在客户端计算机上运行代码。Isopoh.Cryptography.Argon2
通过使用OS调用来缓解这种情况,以防止敏感内存被移动到虚拟内存/页面文件/交换并尽快将其归零。 另一方面,Argon2i具有时间 – 内存权衡漏洞,允许通过使用更多内存来更快地计算哈希值。 关于对Argon2i和Balloon Hashing的实际攻击的论文表明,即使在Argon2 v.1.3中,您需要10次迭代/传递才能使利用效率低下。
以下是一些推荐阅读:
- 速度哈希
- 您可能错误地存储密码
- 您想要了解的有关构建安全密码重置function的所有内容
- 基于表单的网站身份validation的权威指南
- OWASP的密码存储备忘单
- OWASP的忘记密码备忘单
还有video: Crypto回来了! – Google Tech Talk – 2009年8月5日 – 长54分32秒。
在恢复密码时。
首先:不要。 密码恢复选项的目的不是恢复密码,而是恢复对应用程序的访问。 那么……你如何恢复对应用程序的访问?
你很高兴我问。 您需要的是另一种validation用户身份的方法。 这可能是第二个因素身份validation(从安全问题到使用硬件密钥生成器)。 然而,经常做的是为第三方提供资源,例如邮件。
因此,您想知道用户是否是用户之前声称拥有的电子邮件(或手机或其他)的所有者。 为此,您需要将代码(通常称为令牌或cookie)发送到该电子邮件(或其他任何内容)。 这必须是带有加密安全生成器的随机生成代码,以便其他人 – 除了该电子邮件的所有者(或其他任何人) – 将能够知道该代码是什么。
现在,如果用户向您的应用程序提供该代码,您几乎可以肯定它是正确的用户。
几乎是因为:电子邮件(或其他)可能已存储在不安全的位置。 为了缓解这种情况,您希望对代码(cookie或令牌)设置时间限制。 此外,如果已使用代码,则不应再次使用。 为了获得额外的安全性,您可以为CAPTCHA提供资源,以确保此代码不会来自幸运的机器人。
有关此主题的更多信息(此链接也在上面介绍):
- 您想要了解的有关构建安全密码重置function的所有内容
- OWASP的忘记密码备忘单
SHA1的漏洞比MD5少。 这是一种更新的算法,它利用更多的比特,需要更多的处理才能“破解”。 您可以在此处查看大多数主流哈希算法及其已知漏洞: http : //en.wikipedia.org/wiki/Cryptographic_hash_function
正如有人已经评论过的那样,一定要确保在密码哈希中添加“salt”以进一步模糊任何可能的模式。