c# - 在 C# 中存储使用 MD5CryptoServiceProvider 散列的密码是否安全?

标签 c# hash cryptography passwords md5

我们将哈希密码存储在数据库表中。

我们使用 MD5CryptoServiceProvider 在每个密码前加上一个随机盐值和哈希值。

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

如果没有,您能否推荐一个替代的哈希方法来使用(特定的 .NET 框架类)?

最佳答案

散列函数的安全性主要来自其输出(消息摘要)的长度:摘要越长,抗碰撞性越强。生日悖论告诉我们,平均而言,您希望从摘要大小的平方根的功函数中找到碰撞:换句话说,给定 128 位摘要,攻击者希望在 2^ 64 次试验。

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

现在,在存储密码的特定情况下,我注意到您使用的是盐。这是强烈推荐的做法;如果没有盐,您将很容易受到彩虹表攻击。我相信这让您只需要考虑暴力攻击;这就是keylength.com它汇集了整个密码社区对 key 和摘要大小的建议,并给出了各种算法的预期安全时间尺度,同时考虑了当前的计算能力和摩尔定律。考虑您要保护的 Assets 类型以及密码需要多长时间才能保持安全(例如,您是否有强制执行的密码更改策略?)这几乎可以回答您需要的摘要大小的问题。

当然,如果您的用户使用易于猜测的密码,那么世界上最好的密码存储也无济于事。您是否为用户提供强密码提示?您是否考虑过密码强度计或类似工具?

关于c# - 在 C# 中存储使用 MD5CryptoServiceProvider 散列的密码是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2329609/

相关文章:

Java SHA 不工作。哈希值不等于字符串。我的编码有问题吗?

ruby - 如何从散列的散列中删除重复值

python - 如何在Python中加密pickled文件?

c# - 将架构从 SQL Server 数据库传输到 SQL Server CE 数据库的简单方法?

c# - 您将如何在 C# 3.0 中构建桌面应用程序

c# - 如何在 ViewModel 中捕获动态按钮点击

c - 反转 AND 按位

c# - 是否可以根据 ASP.NET/IIS 中的用户代理进行条件 URL 重写?

hash - 使用MD5不安全吗?

perl - 在 Perl 中创建 glibc 2.7 样式的 Sha-512 crypt 哈希