2010-03-25 51 views
1

這是關於在各種語言中使用MD5庫時字符編碼的一般問題。我擔心的是:假設我生成使用原生Python字符串對象的MD5哈希值,像這樣:生成MD5散列跨平臺時的字符編碼問題

message = "hello world" 
m = md5() 
m.update(message) 

然後我採取的MD5哈希的十六進制版本使用:

m.hexdigest() 

和發送郵件& MD5散列通過網絡,比方說,一個JMS消息或HTTP請求。

現在我在Java程序中以本地Java字符串的形式獲取此消息以及校驗和。然後,我生成使用Java的MD5哈希值,像這樣(使用共享編解碼器庫):

String md5 = org.apache.commons.codec.digest.DigestUtils.DigestUtils.md5Hex(s) 

我的感覺是,這是錯誤的,因爲我還沒有在任何一端指定的字符encodng。所以原始的散列將基於Python版本的字符串的字節; Java中的一個將基於Java版本字符串的字節,這兩個字節序列通常不會相同 - 是嗎?所以我真的需要指定「UTF-8」或任何兩端的權利?

(我實際上得到在我的代碼,其中的MD5校驗失敗的間歇性的錯誤,我懷疑這是什麼原因 - 但因爲它是間歇性的,這是很難說,如果改變這種修復與否)

謝謝!

回答

1

是的,您必須是顯式的,因爲MD5校驗和位於BYTES序列之上,而不是字符。因此,您需要將字符預測轉換爲字節。

0

是的,最好在兩端散列相同的編碼。在編碼之前將Python字符串解碼爲一個unicode。