Python - 使用非ascii字符解码base64编码的字符串

时间:2014-10-13 19:29:33

标签: python google-app-engine base64 non-ascii-characters

我正在处理一个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解释器),它会导致错误。

1 个答案:

答案 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)