微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打字机错误:必须在散列之前对 Unicode 对象进行编码

如何解决打字机错误:必须在散列之前对 Unicode 对象进行编码

我想使用来自 kaufland.de 网站的 RestAPI。我按照说明签署了来自:this website 的请求。

这是代码,他们给了我一个例子,运行以 base64 编码的 SHA-256 HMAC 对请求进行签名:

import hmac
import hashlib
import time

def sign_request(method,uri,body,timestamp,secret_key):
    plain_text = "\n".join([method,str(timestamp)])

    digest_maker = hmac.new(secret_key,'',hashlib.sha256)
    digest_maker.update(plain_text)
    return digest_maker.hexdigest()

method = "POST"
uri = "https://www.kaufland.de/api/v1/units/"
body = ""
timestamp = time.time()
secret_key = "83cfe0909f4e57f05dd403"

print(sign_request(method,secret_key))

但是上面的代码抛出了一个错误

TypeError: key: expected bytes or bytearray,but got 'str'

我从SO1找到了一个解决方案,在secret_key前面加了b:

secret_key = b'83cfe0909f4e57f05dd403'

但是,当我运行时它仍然抛出错误

TypeError: Unicode-objects must be encoded before hashing

所以我通过导入 base64 包来遵循 SO2 中的解决方案:

import hmac
import hashlib
import time
import base64

def sign_request(method,hashlib.sha256)
    digest_maker.update(plain_text)
    return base64.b64encode(digest_maker.hexdigest())

method = "POST"
uri = "https://www.kaufland.de/api/v1/units/"
body = ""
timestamp = time.time()
secret_key = b"a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403"

print(sign_request(method,secret_key))

但是还是报错:

Traceback (most recent call last):

  File "<ipython-input-54-83e727ea1edf>",line 22,in <module>
    print(sign_request(method,secret_key))

  File "<ipython-input-54-83e727ea1edf>",line 10,in sign_request
    digest_maker = hmac.new(secret_key,hashlib.sha256)

  File "C:\ProgramData\Anaconda3\lib\hmac.py",line 153,in new
    return HMAC(key,msg,digestmod)

  File "C:\ProgramData\Anaconda3\lib\hmac.py",line 88,in __init__
    self.update(msg)

  File "C:\ProgramData\Anaconda3\lib\hmac.py",line 96,in update
    self.inner.update(msg)

TypeError: Unicode-objects must be encoded before hashing

在这种情况下,有人可以帮助我吗?

解决方法

尝试在分配或 secret_key 中对您的 hmac.new 参数进行编码。

示例:

secret_key = "83cfe0909f4e57f05dd403".encode('utf-8')

或者像我上面写的那样:

digest_maker = hmac.new(secret_key.encode('utf-8'),'',hashlib.sha256)

更新:

import hmac
import hashlib
import time

def sign_request(method,uri,body,timestamp,secret_key):
    plain_text = "\n".join([method,str(timestamp)])

    digest_maker = hmac.new(secret_key.encode('utf-8'),msg=''.encode('utf-8'),digestmod=digestmod)
    digest_maker.update(plain_text.encode('utf-8'))
    return digest_maker.hexdigest()

method = "POST"
uri = "https://www.kaufland.de/api/v1/units/"
body = ""
timestamp = time.time()
secret_key = "a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403"
digestmod = hashlib.sha256

print(sign_request(method,secret_key))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。