为什么PHP的md5与OpenSSL的md5不同?

问题描述:

我很困惑,为什么我在PHP和OpenSSL中看到md5哈希的不同结果。为什么PHP的md5与OpenSSL的md5不同?

这里是我运行的代码:900150983cd24fb0d6963f7d28e17f72

这枚:在

php -r "echo md5('abc');" 

结果0bee89b07a248e27c83fc3d5951213c1

为什么:在

echo abc | openssl md5 

结果?

+0

FWIW,你在好公司犯这个错误。这个问题已经在Stack Overflow上多次提出过,例如: - http://*.com/questions/1147875/difference-in-sha512-between-python-hashlib-and-sha512sum-tool - http:// *.com/questions/1604892/is-the-md5sum-linux-command-working-right - http://*.com/questions/1843383/why-does-perl-and-bin-sha1-give-different - 结果 - http://*.com/questions/2799815/why-is-the-same-input-returning-two-different-md5-hashes – 2010-07-03 00:23:46

+0

好吧,让我感觉好一点:) thnx :) – 2010-07-14 03:27:58

只有一种方法可以计算MD5。

一个盲目的猜测是,第二个还包括被哈希的字符串内的换行符。

Yeh,通过验证。而已。

+5

这很奇怪,但'echo'返回一个换行符。使用'echo -n abc | openssl md5'获得与PHP版本相同的输出。 – artlung 2010-07-02 23:12:42

echo通常在它输出的字符串的末尾添加一个新的行字符;这就是MD5值不同的原因。

试用echo -n abc | openssl md5

由于jdehaan笔记,如果你告诉回声不输出新行,你得到的答案你期待

echo -n "abc" | openssl md5 
900150983cd24fb0d6963f7d28e17f72 

大家都注意到的,问题是,回声打印额外的换行符。

但是,提出的解决方案(echo -n)并不完全正确。根据POSIX标准,“Implementations shall not support any options.”如果你不使用它,你会让世界变得更好。 使用

printf %s abc | openssl md5 

或者干脆

printf abc | openssl md5 
+1

POSIX标准还说*如果第一个操作数是“-n”,或者任何操作数包含反斜杠(''\'')字符,则结果是实现定义的。*(进一步在同一页面下) - 这是XSI扩展,它说-n必须作为普通字符串处理(如果系统符合XSI,则可以使用'echo“abc \ c”'代替) – caf 2010-07-05 00:50:17