我正在处理一个Google App Engine
应用程序,我需要哈希密码并加密它,为此我正在使用以下方法:
def hash_password(password):
#Create salt
salt = base64.urlsafe_b64encode(os.urandom(8))
salted = base64.b64encode(base64.urlsafe_b64decode(salt) + password)
hashed = hashlib.md5(salted).digest()
return base64.b64encode(hashed)
问题在于尝试从base64
解码盐时,因为通过urandom生成的盐具有non-ascii
个字符。它导致错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd8 in position 2: ordinal not in range(128)
我不能跳过在base64
上解码盐的步骤,因为我已经有了一个带有密码和盐的数据存储区,这是通过java代码填充的。
如何保留此结构,并仍然获得有效的哈希密码,我可以使用该密码与我的数据存储区中已经存在的哈希密码进行比较?
当我在终端上使用python解释器执行相同的方法时,它运行时没有任何问题,但是当在GAE的dev服务器上运行它时(在本地,使用相同的python解释器),它会导致错误。
答案 0 :(得分:1)
我认为你正在混合urlsafe_b64encode和decodestring。查看documentation。
你应该使用urlsafe_b64encode和urlsafe_b64decode或b64encode和b64decode
def hash_password(pw):
#Create salt
salt = base64.b64encode(os.urandom(8))
salted = base64.b64encode(base64.b64decode(salt) + pw)
hashed = hashlib.md5(salted).digest()
return base64.b64encode(hashed)
修改强>
binascii使用以下代码完成了这个技巧:
def hash_password(pw):
#Create salt
salt = base64.b64encode(os.urandom(8))
salted = base64.b64encode(binascii.a2b_base64(salt) + pw)
hashed = hashlib.md5(salted).digest()
return base64.b64encode(hashed)