为什么PHP的md5与OpenSSL的md5不同?
我很困惑,为什么我在PHP和OpenSSL中看到md5哈希的不同结果。为什么PHP的md5与OpenSSL的md5不同?
这里是我运行的代码:900150983cd24fb0d6963f7d28e17f72
这枚:在
php -r "echo md5('abc');"
结果0bee89b07a248e27c83fc3d5951213c1
为什么:在
echo abc | openssl md5
结果?
只有一种方法可以计算MD5。
一个盲目的猜测是,第二个还包括被哈希的字符串内的换行符。
Yeh,通过验证。而已。
这很奇怪,但'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
POSIX标准还说*如果第一个操作数是“-n”,或者任何操作数包含反斜杠(''\'')字符,则结果是实现定义的。*(进一步在同一页面下) - 这是XSI扩展,它说-n必须作为普通字符串处理(如果系统符合XSI,则可以使用'echo“abc \ c”'代替) – caf 2010-07-05 00:50:17
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
好吧,让我感觉好一点:) thnx :) – 2010-07-14 03:27:58