【问题标题】:different sha1 checksum on different php versions?不同php版本的不同sha1校验和?
【发布时间】:2010-07-02 15:37:18
【问题描述】:

我运行这个脚本:

define('SECRET', "vJs;ly-W\XDkD_2'-M7S2/ZRRBobxt5");
echo sha1(SECRET . 'zcbkeyky' . 'aaa@bbb.com') . "\n";

本地使用 PHP 5.3.2 (cli) 它给了我:3baa47e50394cd2dce236dcbf2f409fdb9010f2a
在使用 PHP 5.1.6 (cli) 的远程机器上,它给出:d1bcf4ea83e50593d3df19a8455a5f5cd32d63ef

为什么相同的计算结果不同?

【问题讨论】:

  • 如果你真的想测试它是否是错误的,就用一个已知的值来测试它。例如,sha1('apple') 应该是 d0be2dc421be4fcd0172e5afceea3970e2f3d940

标签: php sha1 checksum


【解决方案1】:

我想说问题就在这里:

define('SECRET', "vJs;ly-W\XDkD_2'-M7S2/ZRRBobxt5");
//                        ^^-- escape character

PHP manual 说:

\x[0-9A-Fa-f]{1,2}匹配正则表达式的字符序列是十六进制字符

在 PHP 5.2 和 5.3 之间,显然这已修改为也匹配 \X[0-9A-Fa-f]{1,2}(注意开头的大写 X)。在 PHP 5.3 中运行时,您的字符串中有(不知不觉?)回车。

a) 将反斜杠替换为另一个字符,或者 b) 在定义 SECRET 时使用单引号,并且两个版本都将返回相同的哈希值(在 5.2.1 和 5.3.2 上尝试过)。

【讨论】:

  • +1:很好。我在查看代码时错过了这一点。但是,这确实说明了为什么应该在字符串文字上使用单引号。
  • @R. Bemrose:前段时间我们遇到了一些主要的双引号和一个固执的开发人员的不愉快;教我以最大的怀疑态度对待"。过程是这样的:为什么 SECRET 用双引号定义,其余的用单引号? “如果字符串用双引号括起来,PHP 将为特殊字符解释更多的转义序列”,我们有吗?等一下,反斜杠是什么?
  • @R. Bemrose:原因是它包含一个单引号,但我下次会避开它;)
【解决方案2】:

我唯一能想到的是每个服务器上文件/字符串的编码?

我的结果是 3baa47e50394cd2dce236dcbf2f409fdb9010f2a(本地)

【讨论】:

  • 我认为你关于编码的理论是正确的——但这与文件无关(OP 是对字符串进行哈希处理,而不是对文件进行哈希处理)。我会检查 php.ini 和/或 phpinfo() 以获取更多信息。
  • @Chris:我猜他的意思是 PHP 源文件的编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多