【问题标题】:Python - Decode base64 encoded string with non-ascii charactersPython - 使用非 ascii 字符解码 base64 编码字符串
【发布时间】:2014-10-13 19:29:33
【问题描述】:

我正在开发一个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 的开发服务器上运行它时(在本地,使用相同的 python 解释器),它会导致该错误。

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • 真的很抱歉,这是我的错误。我之前已经在使用 urlsafe_b64decode 了,但是我正在使用不同的方法,试图让它工作,并且意外地我在我的问题上复制了错误的版本。已经编辑过了。
    • 您使用 urlsafe 函数有什么原因吗?
    • 我没有 GAE 服务器来测试它。但是您真的确定您正在运行最新版本的脚本吗? salt 是一个 ascii 字符串,因为它是 b64 编码的。但我认为你也看到了...... :)
    • 我只是使用 urlsafe 方法来确保我没有遇到未来的问题。但是,即使我不使用 urlsafe,我也会遇到同样的问题。我明白为什么它是一个 ascii 字符串,但我的问题是之前生成的,例如 urandom(8) salt。例如,现有的盐是 LG/Y9PrTjHQ=。这不是我生成的,它是数据存储中已经存在的那种盐。如果你解码它,你会看到它包含非 ascii 字符。不幸的是,我必须以某种方式在 GAE 下成功解码。
    • 感谢您的示例。诡异的。您是否尝试过使用binascii? binascii.a2b_base64(salt)
    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2020-12-26
    相关资源
    最近更新 更多