-1

修改我的“问题”,以免打扰当地人。

如今,互联网上似乎有很多资源(包括SO),找到问题的“答案”可能很容易,但是如何判断该答案是否有效甚至是最新的?

一个特别被问到的领域是如何使用 PHP 正确处理散列和加密,以便为数据库存储做准备。关于 SO 的一个常见答案似乎总是“你访问过 php.net 了吗?”。虽然我知道这通常涉及到有人提出最简单的问题的问题,但我开始发现一些描述似乎相互冲突,更重要的是,用户示例已经过时(2008-2009 年很多)。

例如:在寻找为什么以及如何使用密码哈希时:http ://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash

总之,我了解到 sha1 和 md5 是快速且计算高效的哈希方法,它们不再适用于密码哈希。建议的方法是使用 crypt() 函数。

在了解有关 crypt() 尤其是河豚散列的更多信息时,页面上所述的规则如下:

http://www.php.net/manual/en/function.crypt.php

  • 从 $2a$ 开始我的盐
  • 继续使用两个数值(下面的用户已经说明了这一点的重要性,而 php.net 没有)
  • 跟着 $
  • 输入 22 个字母数字字符

进一步阅读给出了一个例子:

<?php

    if (CRYPT_BLOWFISH == 1) {
        echo 'Blowfish:     ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";

    }
?>

似乎同一页面上的示例不遵循它刚刚告诉我们使用的规则(“$2a$07$”之后的 26 个字符。

回报是:

河豚:
$2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

本质上,字符串本身确实被改变了,但几乎我的整个 SALT 值(上面提到的前 22 个字符)都处于开放状态。这不会更简单地确定我的实际字符串是什么吗?

更重要的是,这只是一个例子,但归根结底,PHP.net 等资源的依赖程度有多大?

正如我的朋友 Mugatu 曾经说过的那样:“我觉得我正在服用疯狂的药丸”。

注意:上面提到的页面是自我最初发布以来编辑的,所以我不能保证自从我提供最初的问题和示例后事情没有改变。

4

3 回答 3

6

你是对的,互联网(是一个美妙而可怕的地方)充满了关于你应该如何做到这一点的相互矛盾的信息。我有我自己的观点(我喜欢 EksBlowfish 的单向密码散列),我在这个无耻的、自私自利的博客插件中概述了这些观点。

一个重要的注意事项,以防您不点击该链接。后面的两个数字$2a$不是随机的。它们是在字符串上运行的 EksBlowfish 轮数的 Log-Base-2;基本上,每次将数字增加 1(例如,$2a$07$$2a$08$)时,计算散列所需的时间就会增加一倍。

这是设计使然——它允许 EksBlowfish 在计算上非常昂贵,并且当硬件按比例扩大(摩尔定律)时,您可以将其拖后腿并再次使其变得昂贵。

正如我的一个好朋友所说,试图抵挡好饼干的唯一真正方法就是浪费他们的时间。如果您想了解更多关于 (a) EksBlowfish 和 (b) 为什么要使用它的信息,请再次查看这个无耻的、自私自利的博客插件;如果您愿意,请跳到文章末尾,以获取比我聪明得多的人所写内容的链接。

编辑

至于为什么 PHP 包含 SHA-1 和 MD5 之类的直接实现,是因为 PHP 不是昨天发明的,它已经(以各种形式)存在了 20 年。MD5 曾经被认为是安全的。事情会改变的。

于 2011-07-29T17:26:40.747 回答
3

较旧的散列算法(例如 sha1 和 md5)非常适合某些事情,例如散列数据以实现快速检索。虽然它们不再是加密安全的,但它们仍然有用并且比更安全的算法(如 sha256)计算速度更快。

Sha1 和 Md5 曾经在计算上是相对安全的,但在商业上不可行(如果你不是 NSA 或 KGB)通过暴力破解它们。现在,彩虹表或支持 GPU 的蛮力算法允许任何人将哈希映射到输入中,从而在合理的时间内生成该哈希。几年前,情况并非如此。

于 2011-07-29T17:28:21.580 回答
2

许多网站的问题(除了那些不知道他们在说什么的网站)是一年前适用的网站仍然很受欢迎,但包含过时的信息。MD5曾经有一段时间SHA1是顶级散列算法。不幸的是,现在情况并非如此。存在许多查找表来简单地输入哈希并接收工作密钥,或者可以简单地强行进入它们。同样不幸的是,许多软件包仍然依赖它们,这也是它们仍然存在的原因之一。

尽管它们作为安全散列算法存在缺点,但它们仍然适用于许多情况,例如生成文件校验和。为此使用 MD5 既快速又轻松,并且大多数校验和检查软件仍然支持根据 HD5 和检查文件。

PHP 支持大量的散列算法。查看该hash()函数,该函数也可扩展以支持较新的哈希。您可以使用hash_algos(). 就个人而言,我将 SHA-512 与盐一起使用,因为散列名称中的数字越大意味着散列越好。对?:)

于 2011-07-29T18:15:36.190 回答