我很困惑为什么我在PHP和OpenSSL中看到md5散列的不同结果。
以下是我正在运行的代码:
php -r "echo md5('abc');"
结果于:900150983cd24fb0d6963f7d28e17f72
虽然这个:
echo abc | openssl md5
结果:0bee89b07a248e27c83fc3d5951213c1
为什么?
答案 0 :(得分:21)
只有一种方法可以计算MD5。
盲目的猜测是第二个还包括被散列的字符串中的换行符。
是的,验证了它。就是这样。
答案 1 :(得分:8)
正如大家所说,问题是echo打印了一个额外的换行符。
但是,提出的解决方案(echo -n
)并不完全正确。根据POSIX标准,“Implementations shall not support any options.”如果您不使用它,您将使世界变得更好。
使用
printf %s abc | openssl md5
或只是
printf abc | openssl md5
答案 2 :(得分:6)
echo
通常会在输出的字符串末尾添加一个新行字符;这就是MD5值不同的原因。
尝试使用echo -n abc | openssl md5
。
答案 3 :(得分:1)
正如jdehaan所说,如果你告诉echo不输出换行符,你会得到你期望的答案
echo -n "abc" | openssl md5
900150983cd24fb0d6963f7d28e17f72