PHP MD5(MD5)散列[重复]

Posted

技术标签:

【中文标题】PHP MD5(MD5)散列[重复]【英文标题】:PHP MD5(MD5) hashing [duplicate] 【发布时间】:2014-11-18 21:38:01 【问题描述】:

有人说 md5(md5) 比单独的 md5 更好,但有人说它没有任何作用,有人可以帮助如何使这更安全吗?我对混合的反馈感到很困惑。

$query="INSERT INTO `users` (`email`, `password`)
    VALUES('".mysqli_real_escape_string($link, $_POST['email'])."',
           '".md5(md5($_POST['email']).$_POST['password'])."'
          )";

【问题讨论】:

您永远不应该使用 md5 来存储密码。请改用 bcrypt。 单个 md5() 哈希的熵是每字节数据 256 个潜在的位组合;第二次 md5() 时的熵仅限于第一个哈希的字符集,即每个字节 26 个字母数字 + 10 个数字,因此多次哈希通过减少熵来增加冲突的机会 有人说md5(md5在这段代码里一文不值……是这样吗?如果是的话,有没有办法让这段代码行更安全? 如果您使用php >= 5.5,请鼓励使用password_hash。 查看这个 PHP 常见问题手册页 php.net/manual/en/faq.passwords.php。最好在 salt 上使用 hasing 函数。 【参考方案1】:

MD5 将产生 32 个字符的哈希值 双散列仍然有 32 个字符的散列,所以不要双 md5 任何东西! 如果你想要更长的哈希值(让调用更安全),你应该使用 sha512 、 whirlpool 等。 有关示例,请参阅 php 文档中的 hash() function。

所以你应该使用 hash('sha512',$variable) 而不是 md5(md5($variable))

另请注意,更长的哈希意味着更长的处理时间(= 更多的 CPU!)

【讨论】:

哈希长度并不是越长越安全【参考方案2】:

不要使用 md5 散列来存储密码。而是将 password_hash 函数与 bcrypt 结合使用。见:http://php.net/manual/de/function.password-hash.php

password_hash($password, PASSWORD_BCRYPT, array('cost' => 13));

对于较旧的 php 版本,请查看https://github.com/ircmaxell/password_compat

【讨论】:

+1。正如我已经说过的,如果您使用的是PHP >= 5.5,我强烈建议您也使用password_hashMd5 很久没用了。【参考方案3】:

MD5 对于 512 位或 64 字节的文本是不安全的,因为您在 ist 中找到了一个数学组。你所做的是哈希的哈希。 哈希值比 64 字节短。所以你有一个解决方法。如果它是安全的......我不会为此提供帮助。 您可以在Wiki 下找到更多信息 好的,最好的方法是不要使用 MD5。

【讨论】:

Mark Ba​​ker 在 Wiki 链接中,您可以找到指向制动 MD5 文件的链接,在那里您可以找到 MD5 的功能,在那里您可以找到 MD5 编码块的字符串长度。还有长度512Bit。如果在 CCC 2009 的现场演示中看到它 我根本找不到那个链接;是的,MD5 的编码块大小为 512 位,但我在任何链接页面中都找不到任何说明您所建议的内容。如果为被散列的两个值指定一个 128 字节数据块的公共前缀值,并在 64 字节边界上对齐,则可能会出现冲突问题。 是的,你是对的,你需要一个最小长度为 4 个编码块。编码块长度 = 512 位 -> 64 字节 所以如果你只使用一个块,你是“安全的”。OK? 虽然如果输入较短,算法将填充到 512 位 没有任何一种方法会拆分短于 64 字节的字符串。但不要问我怎么做。

以上是关于PHP MD5(MD5)散列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP md5() 函数

将整个PHP数组散列成唯一值[重复]

使用 SHA-512 和 salt 来散列 MD5 散列密码?

128 位的 SHA-1 散列是不是比 MD5 散列更安全?

我可以通过加盐现有的 MD5 散列并使用 Scrypt 或 PBKDF2 HMACSHA256 散列结果来提高 MD5 散列密码的安全性吗?

什么是MD5