MD5密码两次

时间:2010-12-27 06:46:27

标签: php security hash md5 salt

我知道MD5的安全性最近有问题,这就是很多人使用盐的原因(我根本不明白这一点)但是我想知道你是否想在php中轻松实现安全系统你能不能md5两次?

test> 098f6bcd4621d373cade4e832627b4f6> fb469d7ef430b0baf0cab6c436e70375

基本上是这样的:

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

这会解决整个彩虹安全问题吗?有没有一个简单/ noob证明的方式在PHP中制作安全的数据库密码?

5 个答案:

答案 0 :(得分:9)

H p两次使得没有什么意义,并没有取得多大成就。但是,一般情况下,多次散列可以使某些有意义。例如,如果你散列足够的时间来取100毫秒(左右,取决于硬件),它可以帮助。它的基本思想非常简单:在正常登录中添加100毫秒是一个几乎明显的延迟 - 但是如果你正在尝试为字典攻击构建类似于表的东西,那么乘以时间通过一千个(或者其他任何确切的东西)开始产生真正的差异 - 一个你通常可以在(比如说)一天计算的表,需要几年时间。这是足够的区别,除了真正严重的攻击者之外,任何事情都会在他们完成工作之前很久就会放弃(或者只是觉得无聊)。

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

答案 1 :(得分:4)

如果您不相信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');

在我看来,哈希两次是没有意义的。

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

答案 2 :(得分:3)

您是否使用MD5算法......

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

  

[...]它仍然只需要密码而无需破解。换句话说,你只是将散列函数应用于同一个东西几次。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

为了记录,我评估了

$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个单词,每个都有十六进制)