有没有理由php(和python的)哈希函数与我的系统不同?

时间:2012-02-11 00:26:30

标签: php python linux hash

  

可能重复:
  Why is an MD5 hash created by Python different from one created using echo and md5sum in the shell?

我刚刚看到这个,我不明白。我不知道关于php的内部......某事吗?或者是否有我正在做的假设......某事?这不成立吗?

$ sha512sum <(echo 'hello')
e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629  /proc/self/fd/11

还有:

$ echo 'hello' | sha512sum
e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629  -

然后:

php -a
Interactive shell
php > echo hash('sha512', 'hello');
9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

∅ cat hashtest.php 
<?php
echo hash('sha512', 'hello');
?>
∅ php hashtest.php 
9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

这笔交易是什么?我在Linux x86_64上,我的系统文本编码是utf-8,这些都是ascii-range字符。我不知道我在忽视什么。

有趣的是,对于某些“有趣”的值,Python同意PHP:

>>> hashlib.sha512(b'hello').hexdigest()
'9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043'

老实说,尽管我开放得很谦虚,但我认为这是一种巨大而未知的PHP漏洞。但我猜不是。

4 个答案:

答案 0 :(得分:5)

$ php -a
Interactive shell

php > echo hash('sha512', "hello\n");
e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629

标准echo命令包含尾随换行符。请尝试使用echo -n获得相同的结果。

答案 1 :(得分:2)

echo也会在参数后输出换行符。使用-n选项取消换行:

$echo -n 'hello' | sha512sum
9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043  -

答案 2 :(得分:0)

一切都很简单。 echo在最后添加换行符。

$ php -r 'echo hash(sha512, "hello\n");'
e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629

答案 3 :(得分:0)

Echo为其参数添加了一个换行符,因此您实际上正在散列字符串“hello \ n”。当我使用上面的示例代码在python或php中尝试这个字符串时,我得到了e7c22 ... hash。或者

$ echo -n 'hello' | sha512sum 
9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043  -