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

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

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

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

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

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

见维基

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

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

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

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

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

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

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

这篇Matasano文章, 您需要了解的有关安全密码方案的内容 ,对此主题有一些很好的解读。

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

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

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

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

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