2012-08-16 74 views
0

我不瞭解hashlib的一些東西。我不知道爲什麼我可以解碼常規字節對象,但無法解碼作爲字節對象返回的散列。我不斷收到此錯誤:Python Hashlib&解碼()上的字節對象

的UnicodeDecodeError:在位置1「UTF-8」編解碼器不能解碼字節寫入0xAD:無效的起始字節

這裏是一個的產生這個錯誤我的測試代碼。該錯誤是在第8行(h2 = h.decode('utf-8')

import hashlib 

pw = '[email protected])r' 
salt = 'b7u2qw^T&^#[email protected])hvx7ivRoxr^tDyua' 
pwd = pw + salt 
h = hashlib.sha512(pwd.encode('utf-8')).digest() 
print(h) 
h2 = h.decode('utf-8') 
print(h2) 

如果我不散列它,它工作完全正常......

>>> pw = '[email protected])r' 
>>> salt = 'b7u2qw^T&^#[email protected])hvx7ivRoxr^tDyua' 
>>> pwd = pw + salt 
>>> h = pwd.encode('utf-8') 
>>> print(h) 
b'[email protected])rb7u2qw^T&^#[email protected])hvx7ivRoxr^tDyua' 
>>> h2 = h.decode('utf-8') 
>>> print(h2) 
[email protected])rb7u2qw^T&^#[email protected])hvx7ivRoxr^tDyua 

所以我猜我不理解的東西有關散列,但我不知道我錯過了什麼。

+1

散列是字節串,它們不是文本,你不能解碼它們。也許你真的想使用.hexdigest()如果你想要一個文本形式的哈希? – gps 2012-08-17 05:27:08

回答

0

在第二個示例中,您只需編碼爲UTF-8,然後直接解碼結果。

在第一個示例中,另一方面,您正在編碼爲UTF-8,與字節混淆,然後嘗試將其解碼爲UTF-8。無論結果字節是否仍然有效,因爲UTF-8純粹是偶然的(即使它仍然是有效的UTF-8,它表示的Unicode字符串將與原始字符串沒有關係)。

相關問題