9

我想我在这里失去了我的弹珠......我在我的网站上遇到了一个问题,它随机停止接受登录。我现在已经能够追踪到 crypt() 的行为非常奇怪。

在我的数据库中,我有用户密码的加密版本 - 所以我们说 Og12345678。

当用户登录时,他们输入他们的密码,我从数据库中读取盐,然后加密他们输入的内容并进行比较——通常这很好用。

所以我正在做 crypt($enteredPassword, $saltFromDb) - 在这种情况下,盐当然是 Og。通常对于给定的用户密码 crypt 工作正常。

当事情出错时(当他们这样做时,这是一个永久性的改变,直到我重新启动 Apache)我发现 crypt 开始为相同的输入返回一个不同的答案,使用相同的盐。

然而,它是一致的,即一旦系统出错,crypt 返回错误的答案,但它总是返回相同的错误答案。页面的重复刷新显示相同的输出。同样的盐也出现在新的不正确的 crypt 结果中,所以并不是盐在某个地方丢失了。

如果我然后重新启动 Apache 并重新运行脚本而不做任何更改,那么来自 crypt 的结果就会恢复到应有的状态。

我很欣赏它不是最新的 PHP (5.2.8),但会重视对此的任何看法,包括它是否是在更高版本中修复的已知错误(升级 PHP 并不是一项令人愉快的任务,其中有很多网站仍然使用不幸的怪癖每次升级都需要重新测试) - 如果它是一个已知的固定错误,那么显然我会尽快升级它,除此之外,将地穴外包可能会更容易,因为我只在一个中使用它我的网站的共同点。

任何输入表示赞赏。

马特·佩德尔斯登

--- 更新:2011 年 3 月 11 日

更正先前关于操作系统的评论... - 操作系统是 Windows Server 2008 SP1 64 位。道歉我应该仔细检查而不是假设我能记住!机器是戴尔2950 8gb Ram,至强处理器。

我开始按照 Krtek 的建议进行思考——当系统出现问题时,如果我生成新的 crypt()(即一个非常简单的示例,我将变量设置为字符串,对其进行加密,然后与 crypt 进行比较) - 一切都很好。当我重新启动服务器时,它又回到了以前的计算。所以我肯定倾向于改变用于计算 crypt() 结果的算法......关于可能导致这种情况发生的任何想法?我打印出 CRYPT_STD_DES 等的值,它们在重新启动之间不会改变。

有人对可能导致这种情况发生的原因有任何线索吗?

不管是什么,昨天一天似乎发生了两次,最奇怪的是。

感谢迄今为止的答案。

--- 更新:2011 年 3 月 16 日

只是想提供另一个更新。

这仍在发生,仍然没有进一步了解原因。

万一将来有人遇到这种情况,我认为我的解决方案将是做一些讨厌的黑客攻击,将所有 crypt() 执行推送到外部 C# 应用程序,而不必依赖 PHP 来执行它们。某处出了点问题,此时我能看到的唯一解决方案是将其完全从方程式中删除。

当然,如果它仍然发生,那也将很有趣!:)

谢谢大家。

4

4 回答 4

2

你为什么读盐?你是怎么弄到盐的?不同的算法使用不同的方法在输出中包含盐。

只需使用 crypt 函数的整个输出作为第二个参数:

  $crypted='Og12345678';
  if (crypt($_POST['password'], $crypted)==$crypted) {
      ....

和单程DES?真的吗?

上次我查看时,PHP crypt 实现会调用系统提供的 crypt() 函数——所以如果它已经损坏,那么它比 PHP 更有可能是你的操作系统——但你没有说你的操作系统是什么。

于 2011-03-10T12:42:05.407 回答
1

可能是 Suhosin PHP 安全补丁影响了您的 crypt() 函数。它改变了很多加密/随机方法,可能是您的问题的原因。

检查 phpinfo() 并查看 'suhosin' 是否在页面上的任何位置。如果它在那里,请考虑在 php 配置中禁用它的一些功能。

于 2011-03-10T11:26:17.137 回答
1

我在 crypt 上遇到了同样的问题...我在 2 台服务器上进行了登录检查,但是当我将它转移到最新的服务器时,它最终停止工作。我使用 md5 加密绕过它,如下所示: 在 register.php

 $encrypted = md5($_POST["pass"]);
 ...

然后在 login.php

$password = md5($_POST["password"]);
 if ($password == $row["hash"])
        {
            // remember that user's now logged in by storing user's details in session
            $_SESSION["id"] = $row["id"];
            $_SESSION['username'] = $_POST['username'];
            $_SESSION['logged'] = 'Yes';
            // redirect to homepage
            redirect("index.php");
        }

我希望这会有所帮助:)

于 2013-08-16T17:11:04.483 回答
0

我遇到了同样的问题。自从将我的 vTigerCRM 安装移动到本地计算机后,使用以前存储的密码登录的用户开始失败。似乎 crypt() 在不同的环境中使用相同的参数返回不同的哈希值:

在本地环境上:

SYSTEM: Windows NT 6.1 build 7601 (Business Edition Service Pack 1) i586
PHP: 5.3.5

crypt('hello world','$1$ad0000000'):

     $1$ad00000008tTFeywywdEQrAl9QzV.M1

关于生产环境:

SYSTEM: Linux 2.6.18-338.9.1.el5.lve0.8.32 #1 x86_64
PHP: 5.3.5

crypt('hello world','$1$ad0000000'):

    $1$ad000000$8tTFeywywdEQrAl9QzV.M1
于 2011-08-21T07:31:58.567 回答