在C#中使用MD5CryptoServiceProvider存储密码哈希是否安全?

时间:2010-02-24 21:17:26

标签: c# hash cryptography passwords md5

我们将散列密码存储在数据库表中。

我们使用MD5CryptoServiceProvider为每个密码添加随机salt值和哈希值。

这样安全吗?我听说MD5“坏了”。

如果没有,您能推荐使用备用哈希方法(特定的.NET框架类)吗?

5 个答案:

答案 0 :(得分:11)

散列函数的安全性主要来自其输出的长度(消息摘要):较长的摘要提供更大的抗冲突性。生日悖论告诉我们,平均而言,你希望从摘要大小的平方根的工作函数中找到一个碰撞:换句话说,给定一个128位的摘要,攻击者可能会在2 ^之后命中paydirt。 64项试验。

多年来,MD5一直受到加密社区的不满,因为它只有128位的摘要,而且还有一些有趣的密码分析结果可能会有效地降低其强度。 SHA1(160位摘要)一直是首选的替代方案,但即便如此,它开始看起来不够长,不适合积极主动的对手,研究界也有一些有趣的结果。 SHA-2系列(输出大小从224到512位)是广泛使用的当前首选哈希函数。 NIST组织了一次积极的研究竞赛,以寻找SHA-2的继任者,但直到2012年左右我们才会有新的标准。

现在,在存储密码的特定情况下,我注意到你正在使用盐。这是强烈推荐的做法;如果没有盐,你很容易受到彩虹桌攻击。我相信这只会让你只考虑蛮力攻击;这就是keylength.com的用武之地。它汇集了来自整个加密社区的密钥和摘要大小的建议,并为各种算法提供了预期的安全时间表,考虑了当前的计算能力并考虑了摩尔定律。考虑一下您要保护的资产类型以及密码需要多长时间才能保持安全(例如,您是否有强制密码更改策略?)并且这几乎应该回答您需要的摘要大小的问题。 / p>

当然,如果您的用户使用易于猜测的密码,世界上最好的密码存储将无法帮助您。您是否向用户提供了强密码的提示?你考虑过密码强度计还是类似的?

答案 1 :(得分:8)

我认为SHA256,SHA512此时更安全:)

请参阅wiki

答案 2 :(得分:7)

不,你不应该使用MD5。但是你不应该使用单轮任何通用哈希函数,无论它是多么加密安全,也是!不是MD5,不是SHA-1,不是SHA-2,不是SHA-3。

为什么呢?因为通用哈希函数被设计为 fast 。快速正是您在密码哈希中想要的。快速意味着当坏人获得你的数据库时,他们可以在合理的时间内对它进行普通的旧字典攻击。

您需要的是。最简单的方法是快速迭代快速哈希函数数千次 - 这就是基于MD5和SHA-1的密码方案用于在类UNIX系统上存储密码的方式(它不仅仅是一轮MD5或SHA-1) )。另一种方法是使用设计缓慢的加密原语 - 这就是“bcrypt”密码方案的作用。

这篇Matasano文章What You Need To Know About Secure Password Schemes对这个主题有一些很好的解读。

答案 3 :(得分:3)

使用salt MD5比不使用它更安全,但最好使用其中一个SHA哈希,例如SHA256Managed。

答案 4 :(得分:2)

存储散列密码更好,因为它隐藏了DBA的窥探密码。

此外,是的,MD5已被破坏,但至今仍在使用。如果您担心MD5,请使用SHA-1(MSDN链接here)。这是一个像MD5一样的哈希算法,但更强大。您可以进行最多512位的SHA-1散列。

以下是在VB.NET(http://www.obviex.com/samples/hash.aspx)上完成的示例。

以下是美国国土安全部说明为什么人们应该放弃MD5(http://www.kb.cert.org/vuls/id/836068)。总结,这是“密码破解”