【问题标题】:Better hashing than SHA1比 SHA1 更好的散列
【发布时间】:2010-10-17 18:27:09
【问题描述】:

我正在开发一个应用程序,我需要存储用户密码,所以我想我会将它存储在注册表的当前用户类中,但出于显而易见的原因,我也想对其进行哈希处理,并且我看到新闻表明 SHA1 已被破解,“标准”系统或 .net 中是否有更好的(未破解的)散列算法可用?

【问题讨论】:

  • 是的,我知道 SHA1 在技术上是哈希函数而不是加密函数,但问题仍然存在。
  • 如果你明白其中的区别,为什么你仍然在你的问题中混淆这两者?
  • 我已更新问题和标题以指示散列,而不是加密。

标签: c# hash


【解决方案1】:

SHA1 不是encryption,而是cryptographic hash function。是的,它已经被破坏了,这意味着它可以比蛮力方法更快地产生碰撞。 SHA2 系列没有被破坏。

但我建议每个条目使用自定义种子,这样rainbow table 就不能用于尝试密码。如果您使用的是 SQL Membership 提供程序,password format "Hashed" 已经为每个用户使用了不同的种子。

有关播种哈希的更多信息,请参阅 Thomas Ptacek 的文章 What You Need To Know About Secure Password Schemes

【讨论】:

    【解决方案2】:

    正如您在评论中所说,SHA1 是一种哈希算法,而不是加密。这是一种单向功能,即使被破坏,也不允许找回密码。

    如果您想要 .NET 中已有的更强大的哈希函数,请查看 SHA2 系列 - SHA256、SHA384、SHA512。 (SHA224 也存在,但未在 System.Security.Cryptography 命名空间中实现。)

    对 SHA1 的碰撞攻击实际上还不能被利用,但你可以向前看。鉴于这些攻击,NIST 目前正在运行 SHA3 的选择过程,但这距离完成和商业接受还有几年的时间。另一方面,SHA2 是由 NIST 标准化的现有算法系列,不受已成功针对 MD5 和 SHA1 的攻击。

    【讨论】:

    • 不应该即使有了更好的哈希值,仍然应该使用盐来避免彩虹攻击。
    • 是的,同意,我不否认。但问题是关于更好的哈希算法,而不是使用它的最佳实践。
    【解决方案3】:

    您需要做的是salt 您的密码。这是 C# 中使用 SHA1 和加盐的一些实际 sample code

    SHA1“被破解”的问题是所有基本的可能组合都已预先计算,但是加盐会使您的密码非基本(如果它很弱或很容易猜到,它仍然容易受到暴力破解,但它会杀死彩虹表)

    【讨论】:

    • 是的,一定要加盐。但这并没有解决 SHA1 至少在密码学术语中被“破坏”的事实。
    【解决方案4】:

    哈希算法最近已经显示出weakness 的一些迹象,这就是 NIST 提供hashing contest 的原因,就像他们在加密竞赛中将Rijndael 加冕为新的AES 一样。

    我个人喜欢 MD6 提供的东西,因为它由在密码学领域工作了 3 多年的 Ron Rivest 带头。 MD6 已被撤回,所以我建议在我看来,第 2 轮中一些更强大的候选人是 Keccak、Blue Midnight Wish 和 Fugue。

    从那里开始,一定要使用盐腌等良好做法。

    【讨论】:

    • 为了完整起见,SHA3 竞赛中的recent development 说明了使用未经审查的加密算法的轻率,即使是像 Rivest 这样的大师设计的算法:“..此时 MD6 不”不符合我们自己认为对 SHA-3 候选人应要求的标准。”(当然,我们都有权“喜欢 MD6 所提供的东西”——只是要小心不要超过那个点.)
    • 如果“最近的发展”是指 13 个月前 :)
    • 当前作物(第 2 轮)可在此处找到:csrc.nist.gov/groups/ST/hash/sha-3/Round2/submissions_rnd2.html
    【解决方案5】:

    是的,您可以使用 SHA512,只需记住实际哈希的长度。您也可以随时通过对哈希结果加盐来增加额外的安全性。

    SHA512("The quick brown fox jumps over the lazy dog") = 
       07e547d9 586f6a73 f73fbac0 435ed769 51218fb7 d0c8d788 a309d785 436bbb64
       2e93a252 a954f239 12547d1e 8a3b5ed6 e1bfd709 7821233f a0538f3d b854fee6
    

    如果您想研究其他哈希算法,here's a short list.

    【讨论】:

      【解决方案6】:

      晚了 5 天,但你可以试试这个高度安全的加密功能:

      uint64_t highly_secure_encrypt(char* password) {
        sleep(1);
        return 0;
      }
      

      你不可能从中取回密码。

      现在,谈严肃的事情。如果您还不知道问题的答案,那么您不应该设计安全系统。

      如果您将密码存储在注册表的当前用户部分,那么唯一可以访问它的人(在正常情况下)是用户和管理员。我会(在某种程度上)信任注册表的当前用户部分并使用操作系统提供的标准密码散列机制。

      Jeff Atwood 的 "Rainbow Hash Cracking" 以很好的初学者细节描述了散列和密码存储,Thomas Ptacek 的 "Enough With the Rainbow Tables: What You Need to Know About Secure Password Schemes" 继续告诉您为什么不应该经常尝试自己做。

      选择一个好的哈希函数不到 1% 的战斗力。如果攻击者可以每秒运行数百万次哈希函数,那么他可以每秒测试数百万次组合。您需要的是一个缓慢的、可调的安全散列。这不是一件容易的事,SHA*、MD5 等被设计得非常快,因为它们通常用于文件和文件块,速度为王。

      我建议您阅读更多内容,因为答案就在那里并且很容易找到。

      【讨论】:

      • 您的访问假设假定系统没有受到损害,这是一个非常现实的问题,特别是当普通用户没有受过教育并“管理”他们自己的系统时。
      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2015-05-03
      • 2011-06-08
      • 2015-05-25
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      相关资源
      最近更新 更多