PHP crypt()返回错误的答案

时间:2011-03-10 11:11:49

标签: php crypt

我想我在这里丢失了我的弹珠......我的网站上有一个问题,随机它会停止接受登录。我现在已经能够将它跟踪到crypt()表现得非常奇怪。

在我的数据库中,我已经获得了用户密码的加密版本 - 所以让我们说Og12345678。

当用户登录时,他们输入密码,我从数据库中读取盐,然后加密他们输入的内容并进行比较 - 通常情况下效果非常好。

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

当出现问题时(并且当他们重新启动Apache时它们会永久更改)我发现crypt开始为相同的输入返回一个不同的答案,并使用相同的盐。

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

如果我然后重新启动Apache并重新运行脚本而没有任何更改,那么来自crypt的结果将返回到应该如何。

我很欣赏它不是最新的PHP(5.2.8),但会重视任何观点,包括它是否是在更高版本中修复的已知错误(升级PHP对于许多仍在使用的网站而言并不是一项快乐的任务不幸的怪癖,每次升级都需要重新测试) - 如果它是一个已知的固定bug,那么很明显我会尽快升级它,除此之外,因为我只使用外部隐藏密码可能更容易它在我网站的一个常见位置。

任何意见都赞赏。

Matt Peddlesden

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

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

我开始按照Krtek的建议思考 - 当系统变得不稳定时,如果我生成新的crypt()(即一个非常简单的例子,我将变量设置为字符串,将其加密然后与之比较地穴) - 一切都很棒。当我重新启动服务器时,它再次回到之前的计算中。因此,我肯定倾向于更改用于计算crypt()结果的算法 ...对可能导致这种情况发生的原因的任何想法?我打印出CRYPT_STD_DES等的值,它们在重新启动之间不会改变。

任何人都有可能导致这种情况发生的线索?

无论昨天在一天内发生了什么,最奇怪的是。

感谢迄今为止的答案。

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

只是想提供另一个更新。

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

如果将来遇到这种情况,我认为我的解决方案将是做一些讨厌的黑客将所有crypt()执行推送到外部C#应用程序并停止依赖PHP来做他们。某处出现问题,此时我能看到的唯一解决办法是将其从等式中删除。

当然,如果仍然发生,那么知道也会很有趣! :)

谢谢大家。

4 个答案:

答案 0 :(得分:2)

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

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

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

单通道DES?真的?

上次我看,PHP crypt实现会调用系统提供的crypt()函数 - 所以如果它已经broekn那么它更可能是你的操作系统而不是PHP - 但你没有说你的操作系统是什么

答案 1 :(得分:1)

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

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

答案 2 :(得分: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");
        }

我希望有帮助:)

答案 3 :(得分: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