【问题标题】:Is PHP.net a credible resource for 'any' PHP reference? [closed]PHP.net 是“任何”PHP 参考的可靠资源吗? [关闭]
【发布时间】:2023-10-19 03:14:01
【问题描述】:

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

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

一个特别被问到的领域是如何使用 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 曾经说过的:“我感觉自己正在服用疯狂的药丸”。

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

【问题讨论】:

  • Blowfish 可以解密,因此不适合散列。
  • @sqwk -- JM4 的意思是“EksBlowfish”,一种基于 Blowfish 的散列算法 -- 这不是可逆的块密码!
  • @pst - 我不认为这是一种咆哮,但如果你必须这样称呼它。我称它为程序员和合作者在将其发布给大众之前审查他们的工作的声明。这是一般的技术状态。当人们发布关于如何做正确的事情的问题时,SO 上的人们会生气,当他们不参考像 php.net 这样的基本网站时称他们为白痴,然后反过来该网站(如我上面所展示的)几乎没有感觉。一半的 SO 推荐 sha1 或 md5 加密,网站明确指出不推荐,那么区别在哪里?
  • -1 用于比较苹果和梨。散列!= 加密
  • @fyr - 我是否将两者进行了同等比较?散列是加密不可或缺的一部分,所以是的,它们是相关的,当一个被愚弄时,对后者的期望就会随之而来。

标签: php encryption md5 blowfish crypt


【解决方案1】:

你说得对,互联网(一个美妙而可怕的地方)充满了关于你应该如何做到这一点的相互矛盾的信息。我有自己的观点(我喜欢用 EksBlowfish 进行单向密码散列),我在 this shameless, self-serving blog plug 中进行了概述。

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

这是设计使然——它使 EksBlowfish 的计算成本非常高,并且当硬件扩大规模时(摩尔定律),您可以将其拖后腿并再次变得昂贵。

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

编辑

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

【讨论】:

  • 好答案。感谢您抽出宝贵时间来解释上面的 log-base-2 部分并给出除“您查看 php.net”以外的其他回复。我对大量反对票的假设正是基于我对大多数 SO 海报的抨击。不过,我确实很欣赏一个好的答案。我会看看你的博客。
  • 信不信由你,crypt 的 PHP 手册曾经非常糟糕;我不得不打开bug ticket 让他们将描述修改到甚至可以轻微使用的程度。有关更多信息,请查看我在研究 EksBlowfish/Crypt 时提出的两个问题:*.com/questions/2225644/…*.com/questions/2225720/…;祝你好运!
【解决方案2】:

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

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

【讨论】:

  • 对更改的良好分析并继续支持此类字符串函数。
  • @JM4:而且大多不正确,尤其是关于计算 SHA1 原像攻击的难易程度。
  • Sha1 在碰撞攻击方面显示出足够多的裂缝,我会注意在新软件中使用它(通常持续时间比最初预期的要长得多)。 en.wikipedia.org/wiki/SHA-1#Attacks
【解决方案3】:

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

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

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

【讨论】:

    最近更新 更多