2010-07-02 138 views
7

我很困惑,爲什麼我在PHP和OpenSSL中看到md5哈希的不同結果。爲什麼PHP的md5與OpenSSL的md5不同?

這裏是我運行的代碼:900150983cd24fb0d6963f7d28e17f72

這枚:在

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

結果0bee89b07a248e27c83fc3d5951213c1

爲什麼:在

echo abc | openssl md5 

結果?

+0

FWIW,你在好公司犯這個錯誤。這個問題已經在Stack Overflow上多次提出過,例如: - http://stackoverflow.com/questions/1147875/difference-in-sha512-between-python-hashlib-and-sha512sum-tool - http:// stackoverflow.com/questions/1604892/is-the-md5sum-linux-command-working-right - http://stackoverflow.com/questions/1843383/why-does-perl-and-bin-sha1-give-different - 結果 - http://stackoverflow.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

回答

21

只有一種方法可以計算MD5。

一個盲目的猜測是,第二個還包括被哈希的字符串內的換行符。

Yeh,通過驗證。而已。

+5

這很奇怪,但'echo'返回一個換行符。使用'echo -n abc | openssl md5'獲得與PHP版本相同的輸出。 – artlung 2010-07-02 23:12:42

6

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

試用echo -n abc | openssl md5

1

由於jdehaan筆記,如果你告訴回聲不輸出新行,你得到的答案你期待

echo -n "abc" | openssl md5 
900150983cd24fb0d6963f7d28e17f72 
8

大家都注意到的,問題是,回聲打印額外的換行符。

但是,提出的解決方案(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