我很困惑,爲什麼我在PHP和OpenSSL中看到md5哈希的不同結果。爲什麼PHP的md5與OpenSSL的md5不同?
這裏是我運行的代碼:900150983cd24fb0d6963f7d28e17f72
這枚:在
php -r "echo md5('abc');"
結果0bee89b07a248e27c83fc3d5951213c1
爲什麼:在
echo abc | 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://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
好吧,讓我感覺好一點:) thnx :) – 2010-07-14 03:27:58