Python中使用MD5()进行编码和解码

3
在Python 3.1.1上的Ubuntu 10.10中运行此代码时,我遇到了以下错误:UnicodeDecodeError: 'utf8'编解码器无法解码位置0处的字节0xd3:无效的连续字节。错误的位置取决于我何时运行以下代码:(不是真正的密钥或密码)
sandboxAPIKey = "wed23hf5yxkbmvr9jsw323lkv5g"
sandboxSharedSecret = "98HsIjh39z"

def buildAuthParams():
    authHash = hashlib.md5();

    #encoding because the update on md5() needs a binary rep of the string
    temp = str.encode(sandboxAPIKey + sandboxSharedSecret + repr(int(time.time())))
    print(temp)

    authHash.update(temp)

    #look at the string representation of the binary digest
    print(authHash.digest())

    #now I want to look at the string representation of the digest
    print(bytes.decode(authHash.digest()))

这是一次运行的输出结果(其中实际输出中的sig和key信息已更改)。
b'sdwe5yxkwewvr9j343434385gkbH4343h4343dz129443643474'
b'\x945EM3\xf5\xa6\xf6\x92\xd1\r\xa5K\xa3IO'

print(bytes.decode(authHash.digest()))
UnicodeDecodeError: 'utf8' codec can't decode byte 0x94 in position 0: invalid start byte

我猜测我的解码调用有问题,但我无法弄清楚是什么问题。authHash.digest的打印输出看起来对我来说是有效的。

我真的很感激任何关于如何使这个工作的想法。


1
1.3.1?那个版本应该是在90年代中后期。你在哪里找到的这么老的Python版本,更不用说是在Ubuntu上了吧?你应该是指的3.1.1吧? - Karl Knechtel
哇哦 - 选了个不好的星期停止嗅胶。是的,我指的是3.1.1。 - TheSteve0
1个回答

4
当您尝试将bytearray解码为字符串时,它会按顺序将字节与编码集(默认为utf-8)中的有效字符进行匹配,如果无法将一系列字节与utf-8字母表中的有效字符匹配,则会引发异常。
同样的情况也会发生在使用ascii解码时,大于127的任何值都是无效的ascii字符。
因此,如果您想获取md5哈希的可打印版本,应该使用hexdigest方法,这是打印任何类型哈希的标准方法,每个字节由2个十六进制数字表示。
为了做到这一点,您可以使用以下代码:
authHash.hexdigest()

如果您需要在URL中使用它,您可能需要将bytearray编码为base64:
base64.b64encode(authHash.digest())

那么我该如何将它从十六进制转换为ASCII码呢?另一端的服务器不需要十六进制编码,只需要ASCII码表示。我尝试使用binascii.a2b_hex()和binascii.unhexlify(),但没有成功。 - TheSteve0
你需要服务器获取原始字节吗?例如,对于md5(b'1'),您必须发送服务器:b'\xc4\xcaB8\xa0\xb9#\x82\r\xccP\x9aou\x84\x9b'吗?因为这无法转换为ASCII :-/,您应该通过套接字发送原始字节。 - Santiago Alessandri
谢谢建议。我已将其添加到我的答案中。 - Santiago Alessandri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接