2012-11-07 34 views
24

可能重复:
Python hashlib problem “TypeError: Unicode-objects must be encoded before hashing”的Python 3.3 - Unicode的对象必须散列之前被编码

这里是在Python 3的码,其与盐生成密码:

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) 

它给我的错误是:

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 

我不允许更改生成密码的算法,所以我只想用方法encode('utf-8')修复错误。我该怎么做?

+0

问题是与''123'',它没有编码。 –

回答

30

直接让你已经在pwsalt字符串中提到的方法:

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

不工作。哪一个是正确的:'返回hashlib.sha256(pw.encode('utf-8')+ salt.encode('utf-8')).hexdigest()+“,”+ salt'或' ((pw + salt).encode('utf-8')。hexdigest()+“,”+ salt' –

+0

@Grienders我会尽可能早地使用字节,所以要单独编码pw(或者期望它是字节)第一个地方是'b'123'')并且已经将字符串创建为字节,所以在'make_pw_hash()'中使用'string.ascii_letters.encode(“latin1”)'(或者utf8,它有相同的结果)。这不会改变算法,只是实现。 – glglgl

相关问题