2

所以我知道 MD5 在技术上是新应用程序中的禁忌,但我随机想到了这一点:

自从

md5($password);

不安全,不会

md5(md5($password))

成为更好的选择?我使用得越多,它会变得越安全吗?说如果我做了这样的功能

function ExtremeEncrypt($password)
{
 $encryptedpass = md5(sha1(md5(md5($pass))));
 return $encryptedpass;
}

这个函数是否是一个很好的替代方案,可以像 vbulletin 那样为每个帐户使用随机盐。

4

5 回答 5

8

对字符串进行双重散列除了限制您的密钥空间并使冲突更有可能之外,什么都不做。请不要这样做。双重 md5 哈希实际上不如带有一些攻击向量的单一哈希安全。

更好的选择是使用 php 5.5 中的password_hash函数或早期 php 版本的 ircmaxell 的password_compat库。

于 2013-09-17T14:04:17.507 回答
5

首先:哈希和加密不一样。哈希是一种单向函数,而加密期望数据可以被解密。

在安全方面,您不应该尝试发明自己的解决方案。在 PHP 中,从 5.5 版本开始,有一个名为Password Hashing的原生解决方案。md5()不安全的,你应该意识到这一点。

如果你有低于 5.5 版本的 PHP,你应该使用salt来散列和存储你的密码。

于 2013-09-17T14:01:35.277 回答
2

您在这里有很多答案,它们是准确的,但它们并没有真正解释原因。

MD5 是一种散列算法。哈希算法的作用是获取一段较长的数据,并以一种创建较小数据段的方式对其进行加密分析。因此,ABCDEFGHIJKLMNOPQRSTUVWXYZ使用我的自定义哈希算法,我可能会创建一个数字哈希5

完成后,您会丢失信息 -ABCDEFGHIJKLMNOPQRSTUVWXYZ包含比5其他方式更多的信息并且无法进行翻译。

以仅允许结果为 0-9(这实际上是校验和)的方式进行散列的问题在于,如果您获取两段文本,则它们具有相同散列的可能性非常高。所以也许我的算法ZZZZZZZZZ也会产生5. 这就是所谓的Hash Collision

现在,如果我获取我的哈希值会发生什么?好吧,我的出发点已经是非常低的信息了——最多可能是十位数之一,所以现在发生碰撞的可能性非常高。假设当我的哈希算法在数字上运行时,它会返回1奇数和偶数 -0所以如果我有一个哈希值,ABCDEFGHIJKLMNOPQRSTUVWXYZ那么5我有 10% 的机会发生冲突。但是,如果我对那个散列进行散列,我现在将有 50% 的机会发生冲突。

密码学的诀窍是将信息隐藏在如此巨大的可能空间中,以至于很难找到。你越是缩小可能的空间,你的信息隐藏得越少。

于 2013-09-17T14:47:09.497 回答
0

简短的回答:

md5 很容易使用暴力破解。添加额外的散列层只会线性地减慢暴力攻击。

于 2013-09-17T14:08:23.340 回答
-3

首先,md5 并不是真正的加密,因为它没有解密方法。这称为散列。

标准做法是给你的密码加盐:

$salt = [some random/unique number, people usually use user_id or timestamp]
$hashed_password = sha1($salt . $password)

请记住,您需要知道盐,因此通常意味着将其与散列密码一起存储。

你可以有多种盐,并按照你喜欢的方式排列它们。

于 2013-09-17T14:02:15.937 回答