【问题标题】:password_compat for older php version旧 php 版本的 password_compat
【发布时间】:2012-09-09 16:57:57
【问题描述】:

PHP 5.5 将support 密码函数password_hash()password_verify()。还有一个file 在>5.3.7 中添加此功能。

我的问题是我目前正在运行 debian 包 5.3.3-7+squeeze14。

有没有办法让这个函数在这个旧的 PHP 版本中可用?

【问题讨论】:

  • 有没有办法更新你的PHP?这将是最好的解决方案。
  • 这不是一台服务器的问题。我的许多客户运行的不是最新的 PHP 版本。在某些服务器上,我只有 ftp/ssh 或根本没有访问权限。
  • 我没有看到其他解决方案,然后通过手动编码重建这些功能。
  • @JvdBerg 手动编码 crypt() + bcrypt 的 5.3.7 之前的版本对于大多数人来说并不是一个真正的选择

标签: php security hash passwords php-password-hash


【解决方案1】:

之所以将 5.3.7 设为最低版本,是因为在早期版本的 PHP 中使用 bcrypt 的 crypt() 函数输出的结果与当前版本大不相同。

您可以自己查看结果:http://3v4l.org/3cAZf

使用以下代码:

<?php
var_dump(crypt('rasmuslerdorf', '$2y$07$usesomesillystringforsalt$'));

5.3.7 - 5.3.16、5.4.0 - 5.4.6 的输出

string(60) "$2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi"

4.3.0 - 4.3.11、4.4.0 - 4.4.9、5.0.0 - 5.0.5、5.1.0 - 5.1.6、5.2.0 - 5.2.17、5.3.2 - 5.3 的输出.6

字符串(13) "$25di0cl7EYZA"

5.3.0 - 5.3.1 的输出

字符串(13) "$2v4FKr10WzJ2"

【讨论】:

    【解决方案2】:

    PHP >= 5.3.7 是必需的,因为该版本中包含了固定的 bcrypt 算法 2y。以前的 2a 算法在密码超出 US-ASCII 范围时被破坏。

    您的 5.3.3-7+squeeze14 版本很可能也包含此修复程序。发行版通常保留在某个特定版本,但向后移植安全修复程序(例如这个)。

    因此,您应该只检查该算法是否可用,如果可用,您可以安全地使用 password_compat。

    包裹的changelog 有点不清楚。它提到添加了2x,但没有说明是否也添加了2y(但可能是)。

    【讨论】:

    • 感谢内幕!这是否意味着如果我删除版本开关它应该可以工作?看起来没有。 password_hash('foo', PASSWORD_BCRYPT) 返回 false,因为 crypt 返回一个短散列。
    • @PiTheNumber var_dump(crypt('foo', '$2y$05$bar')); 为您输出什么?
    • @PiTheNumber var_dump(crypt("foo\xaabar", '$2a$05$bar')); 给你什么?
    【解决方案3】:

    所以,在开始之前,让我先澄清一件事。我是相关库的作者(以及 5.5 的补丁)。

    话虽如此,其他人所说的绝对正确。 5.3.7 是最低版本的原因是之前的所有版本在 bcrypt 实现中都有一个错误,这可能导致使用高字节字符(代码点 >= 128)的密码中的熵丢失。

    这是 5.3.7 成为最低版本的主要原因。我会强烈建议至少升级到 5.3.7,但最好是最新的(在不太旧的版本中发现了许多重要的安全问题)。

    现在,如果您卡在较低版本上,该怎么办?您可以分叉库并将$2y$ 调整为$2a$。这至少会让你工作。以这种方式生成的密码将可移植到未来的版本中(该库旨在能够验证旧的crypt() 密码)。

    但是,我建议您不要这样做。只需升级到较新版本的 PHP。这并不难(dotdeb 的 deb 包可以为您完成)。

    如果您真的卡在旧版本上,我建议您使用专为此设计的库。像我的PasswordLibPhPass 之类的东西(请注意,您应该只使用该库的链接版本,github 上还有其他几个完全不同的版本)。

    【讨论】:

    • +1。对于将来阅读本文的人,请注意已从 lib 中删除了 5.3.7 版本要求,因为来自 Debian 的最新 5.3.3(根据问题)包含相关补丁。相反,password_compat 的安装程序通过在继续之前执行测试crypt() 操作来检查补丁是否到位。
    • 我需要更正我之前的评论。在尝试让password_compat 工作在一个普通的Debian Squeeze 安装上之后,事实证明Debian Suqeeze 确实支持password_compat。是的,Debian 已经向后移植了相关的安全补丁,但是他们没有向后移植了$2y$ 哈希选项。我有 php5.3.3-7-squeeze15:password_compat 的 version_test 响应 false,并且使用密码函数的代码也失败了。 @ircmaxell:这与我在 github 上阅读相关票证时所理解的直接相矛盾。你能帮我确认一下吗?还是我做错了什么?
    • @SDC:我在那个线程中做了所有其他人告诉我的关于他们的测试的事情。我将下载一个 Squeeze 实例以加载到 VM 中,如果它不起作用,那么我将恢复版本检查。
    • 一旦您以一种或另一种方式得到确认的答案,请在此处发表评论(或更新答案);在我确定之前,我不会切换到 PasswordLib 或 PhPass。但是重新将代码改回来......你知道,我想我会留下你所拥有的版本测试 - 它完成了它需要的工作,即使 Debian 没有向后移植修复程序,也可能有是其他发行版。不过,这取决于你。
    • @DannyG 5.3.24 > 5.3.7,所以你可以使用它。但除此之外,这取决于你,这个真正了解更多的人,来推动客户端让他们的主机更新。你有那个权力。你没有被困住。成为你想成为的改变是你的责任......
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多