我有些困惑,不明白为什么在PHP和OpenSSL中进行MD5哈希得到的结果不同。
下面是我运行的代码:
php -r "echo md5('abc');"
结果为:900150983cd24fb0d6963f7d28e17f72
而这个:
echo abc | openssl md5
结果为:0bee89b07a248e27c83fc3d5951213c1
为什么呢?
我有些困惑,不明白为什么在PHP和OpenSSL中进行MD5哈希得到的结果不同。
下面是我运行的代码:
php -r "echo md5('abc');"
结果为:900150983cd24fb0d6963f7d28e17f72
而这个:
echo abc | openssl md5
结果为:0bee89b07a248e27c83fc3d5951213c1
为什么呢?
只有一种方法可以计算MD5。
一个猜想是第二个字符串在被哈希处理时也包含了一个换行符。
没错,已经验证。就是这样。
echo
会返回一个新行符。使用 echo -n abc | openssl md5
可以得到与 PHP 版本相同的输出结果。 - artlung众所周知,问题在于echo会输出一个额外的换行符。
然而,提出的解决方案(echo -n
)并不完全正确。根据POSIX标准,“实现不应支持任何选项。”如果您不使用它,您将使世界变得更好。使用
printf %s abc | openssl md5
printf abc | openssl md5
-n
,或者任何操作数包含反斜杠( '\'
)字符,则结果是实现定义的。(在同一页下方) - 这是XSI扩展规定的,-n必须被处理为普通字符串(如果系统符合XSI,则可以使用echo“abc\c”
代替)。 - cafecho
命令通常在输出字符串末尾添加一个换行符,这就是为什么 MD5 值会不同的原因。
尝试使用 echo -n abc | openssl md5
命令。
echo -n "abc" | openssl md5
900150983cd24fb0d6963f7d28e17f72