2015-11-19 50 views
0

我只是測試了python 3.4.3 md5哈希。我不明白我得到的結果。我試圖比較我的SQL數據庫中的散列密碼,但每隔一段時間我嘗試這樣做,我得到不同的結果。這裏是我創造來說明我的問題代碼:我需要幫助理解md5哈希python 3.4.3

import hashlib 

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
p = '5' 
for i in x: 

    k = hashlib.md5(p.encode('utf-8')) 
    print(k) 

結果:

<md5 HASH object @ 0x02A07B10> 
<md5 HASH object @ 0x02A07CF0> 
<md5 HASH object @ 0x02A07B10> 
<md5 HASH object @ 0x02A07CF0> 
<md5 HASH object @ 0x02A07B10> 
<md5 HASH object @ 0x02A07CF0> 
<md5 HASH object @ 0x02A07B10> 
<md5 HASH object @ 0x02A07CF0> 
<md5 HASH object @ 0x02A07B10> 
<md5 HASH object @ 0x02A07CF0> 
<md5 HASH object @ 0x02A07B10> 
+1

側面說明:不要使用無鹽哈希密碼哈希值。就此而言,如果可能的話,不要將自己的密碼轉換爲散列碼。如果您可以使用Python 3.4+(或早期版本的pyOpenSSL),請使用['hashlib.pbkdf2_hmac'](https://docs.python.org/3/library/hashlib.html#hashlib.pbkdf2_hmac)鹽和一些哈希輪,這些(雖然旨在從密碼中生成私鑰)對於生成密碼哈希也是安全的,這些密碼哈希不能被粗暴強制。 – ShadowRanger

+0

不應該使用MD5來哈希密碼,它的速度太快了(你可以用一個好的GPU對[100 Giga MD5每秒](http://hashcat.net/oclhashcat/#performance)進行蠻力操作)。取而代之的是使用像BCrypt或PBKDF2這樣的成本因子的慢哈希函數。 – martinstoeckli

回答

4

您的輸出打印HASH對象的地址,而不是MD5摘要本身。

如果你想看到那個,請在該對象上調用digest()。這將返回MD5的128位輸出爲16字節的字符串。如果你想打印出來的十六進制,使用hexdigest()代替:

k = hashlib.md5(p.encode('utf-8')).hexdigest() 
+0

爲了記錄,其執行此操作的原因是:1.摘要有多種常見輸出格式(原始二進制與十六進制)2.哈希通常是通過散列數據塊計算的,並且可以迭代地構建通過逐個傳遞新塊(所以整個文件不需要加載到內存中);除非你問,否則它不會計算摘要,因爲你可能有更多的數據需要散列。 – ShadowRanger

+0

@ShadowRanger說得好 – Adam