【问题标题】:MD5 password twice两次MD5密码
【发布时间】:2011-05-31 00:56:13
【问题描述】:

我知道 MD5 的安全性最近受到质疑,这就是很多人使用 salt 的原因(顺便说一句,我完全不明白)但我想知道你是否想在 php 中轻松实现一个安全系统,你可以md5 东西两次?

点赞test > 098f6bcd4621d373cade4e832627b4f6 > fb469d7ef430b0baf0cab6c436e70375

所以基本上:

$val = 'test';
$val = md5($val);
$val = md5($val);

这会解决整个彩虹安全问题吗?是否有一种简单/新手证明方法可以在 php 中制作安全的数据库密码?

【问题讨论】:

标签: php security hash md5 salt


【解决方案1】:

两次散列没有什么实际意义,也没有多大作用。然而,一般来说,多重散列可能会产生一些意义。例如,如果您散列足够多的时间以花费大约 100 毫秒(或更多,取决于硬件),它可能会有所帮助。一点。它的基本思想非常简单:在正常登录的基础上增加 100 毫秒是一个几乎明显的延迟——但如果你试图构建一个类似字典攻击的表,则乘以时间大约一千(或任何确切的结果)开始产生真正的差异 - 您通常可以在(例如)一天计算的表,而需要几年时间。这已经足够不同了,除了真正严重的攻击者之外,任何人都经常会在完成工作之前很久就放弃(或者只是感到无聊)。

Salt 是一个完全独立的工具。使用它可以弥补底层散列函数的弱点。这里的想法是,用于字典攻击的表的 size 变得相当大(例如,对于单字节盐,大 256 倍)。盐通常是保密的,但它是相对随机的,因此进行字典攻击的攻击者不能只是按原样散列每个单词,而是必须考虑每个可能的盐值。冒着重复的风险:它处理的是(大多数)人们如何选择密码的弱点,不是散列函数本身的任何弱点。

【讨论】:

  • 哦,这很有意义,谢谢!因此,盐基本上是所有密码预加密的附加值,因此可以提高密码安全性。
  • @NoviceCoding,有关加盐的更多信息,请阅读stackoverflow.com/questions/1645161/…
【解决方案2】:

如果你不相信MD5,你可以使用hash()函数尝试更高的算法:

$hash1 = hash('sha1', 'The string to hash by SHA-1');
$hash2 = hash('sha256', 'The string to hash by SHA-256');
$hash3 = hash('sha512', 'The string to hash by SHA-512');
$hash4 = hash('ripemd160', 'The string to hash by RIPEMD-160');

在我看来,两次散列是没有意义的。

编辑:修正了最后一行代码中的错字。

【讨论】:

  • 哇不知道php有这些功能。你会建议哪一个会很好,但不会矫枉过正?
  • @Novice 这并不重要。所有这些算法都不比MD5好。只有加盐、密码强化和重复次数可以帮助您
  • sha256 比 md5 好得多(和 sha1 就这点而言) sha256 被认为是一种强大的算法。无论您使用什么算法,都必须包含随机盐。
  • @Marcel J. Kloubert,所有常见的散列都有其来源。不同的是,RIPEMD-160 不受任何专利的限制;但它比 SHA256 受到的审查更少。
  • @Jacco:所有的 SHA 算法都没有专利并且属于公共领域。
【解决方案3】:

无论你是否使用 MD5 算法...

不,攻击者总是可以拥有两张彩虹表(一张用于额外级别的哈希,一张用于密码)。来自another answer of mine

[...] 它仍然只需要密码就可以破解。换句话说,您只是将散列函数多次应用于同一事物。

您使用盐来使攻击者更难获取您的密码,因为这样他就需要知道盐,以便他可以使用它来计算您密码的哈希值。

【讨论】:

  • 是的,没想到这一点。谢谢
  • 此外,您可以为每个密码使用不同的盐。否则,如果我能确定你的盐是什么,我可以为你的整个数据库生成一个彩虹表。如果您使用不同的盐,我只能为单个密码创建一个彩虹表(这没有用 - 我还不如蛮力它。)
  • 所以我知道最好的方法是生成一个随机的数字串(盐),将其添加到密码中,然后对其进行哈希处理。散列后,将密码与盐一起存储在数据库中。所以,我的问题是marcel提到的其他哈希方法是否有彩虹表?那么我最好是加盐 MD5 还是只使用 RipeMD(可能更容易实现)?
  • @NoviceCoding:只需避免使用 MD5 进行密码散列。
【解决方案4】:

安全地存储密码很棘手,这里发布的大多数建议都不准确。因此,我将遵从 Thomas Ptacek 关于该主题的广泛引用的帖子:http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

【讨论】:

    【解决方案5】:

    作为记录,我对此进行了评估

    $val = 'test';
    $salt='somerandom!!aa##9900';
    $val = md5($salt.$val);
    $val = md5($val);
    

    它非常安全。秘密就在盐里。

    但是,md5 很短,因此并发的机会“高”(1.208.925.819.614.629.174.706.176 = 32^16,32 个单词,每个单词都有一个十六进制)

    【讨论】:

    • 盐必须存储在某个地方,因为您需要它进行验证,这意味着它不再是秘密。不应该使用MD5,因为它太快了,你可以计算超过100Giga MD5 per second。在同一页面上,您可以看到破解工具通常支持开箱即用的双 MD5 等派生。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2011-04-30
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2021-04-10
    相关资源
    最近更新 更多