2012-11-07 10 views
24

Możliwe zduplikowane:
Python hashlib problem “TypeError: Unicode-objects must be encoded before hashing”Pythona 3,3 - Unicode przedmioty muszą być zakodowane przed mieszania

Oto kod Pythona 3, który wytwarza hasło solą:

import hmac 
import random 
import string 
import hashlib 


def make_salt(): 
    salt = "" 
    for i in range(5): 
     salt = salt + random.choice(string.ascii_letters) 
    return salt 


def make_pw_hash(pw, salt = None): 
    if (salt == None): 
     salt = make_salt() #.encode('utf-8') - not working either 
    return hashlib.sha256(pw + salt).hexdigest()+","+ salt 


pw = make_pw_hash('123') 
print(pw) 

Błąd, który mi daje:

Traceback (most recent call last): 
    File "C:\Users\german\test.py", line 20, in <module> 
    pw = make_pw_hash('123') 
    File "C:\Users\german\test.py", line 17, in make_pw_hash 
    return hashlib.sha256(pw + salt).hexdigest()+","+ salt 
TypeError: Unicode-objects must be encoded before hashing 

Nie wolno mi zmieniać algorytmu generowania hasła, więc chcę tylko naprawić błąd, używając prawdopodobnie metody encode('utf-8'). Jak mogę to zrobić?

+0

Problem jest z ' '123'', który ma kodowanie. –

Odpowiedz

30

Wystarczy wywołać metodę już wspomniano na pw i salt strun:

pw_bytes = pw.encode('utf-8') 
salt_bytes = salt.encode('utf-8') 
return hashlib.sha256(pw_bytes + salt_bytes).hexdigest() + "," + salt 
+0

Nie działa. Który z nich jest poprawny: 'return hashlib.sha256 (pw.encode ('utf-8') + salt.encode ('utf-8')). Hexdigest() +", "+ salt' lub' return hashlib.sha256 ((pw + sól) .encode ('utf-8'). hexdigest() + "," + salt' –

+0

@Grienders Użyłbym bajtów tak wcześnie, jak to możliwe. Więc zakoduj osobno pw (lub spodziewaj się tego jako bajta w pierwsze miejsce, 'b'123'') i utwórz hash jako bajty, więc użyj' string.ascii_letters.encode ("latin1") '(lub utf8, który ma taki sam wynik) w' make_pw_hash() '. To nie zmienia algorytmu, tylko implementację. – glglgl

Powiązane problemy