我们将哈希密码存储在数据库表中。
我们使用 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/