我想我在这里失去了我的弹珠......我在我的网站上遇到了一个问题,它随机停止接受登录。我现在已经能够追踪到 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 来执行它们。某处出了点问题,此时我能看到的唯一解决方案是将其完全从方程式中删除。
当然,如果它仍然发生,那也将很有趣!:)
谢谢大家。