【问题标题】:Why PHP's md5 is different from OpenSSL's md5?为什么 PHP 的 md5 与 OpenSSL 的 md5 不同?
【发布时间】:2011-03-11 07:43:13
【问题描述】:

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

这是我正在运行的代码:

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

结果:900150983cd24fb0d6963f7d28e17f72

此时:

echo abc | openssl md5

结果:0bee89b07a248e27c83fc3d5951213c1

为什么?

【问题讨论】:

标签: php openssl md5


【解决方案1】:

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

盲目的猜测是第二个在被散列的字符串中也包含一个换行符。

是的,已验证。就是这样。

【讨论】:

  • 这很奇怪,但 echo 返回一个换行符。使用echo -n abc | openssl md5 获得与PHP 版本相同的输出。
【解决方案2】:

正如大家所说,问题在于 echo 打印了一个额外的换行符。

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

printf %s abc | openssl md5

或者干脆

printf abc | openssl md5

【讨论】:

  • POSIX 标准还规定 如果第一个操作数是 -n,或者任何操作数包含反斜杠 ('\') 字符,则结果是实现定义的。 i>(在同一页的下方)- XSI 扩展表明 -n 必须作为普通字符串处理(如果系统符合 XSI,那么您可以改用 echo "abc\c"
【解决方案3】:

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

试试echo -n abc | openssl md5

【讨论】:

    【解决方案4】:

    正如 jdehaan 所说,如果你告诉 echo 不要输出换行符,你会得到你期望的答案

    echo -n "abc" | openssl md5
    900150983cd24fb0d6963f7d28e17f72
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多