代码示例显示了一个脚本,该脚本可用于从python 2.7中的服务下载日志。
我正在将脚本更新为与python 3兼容,但无法弄清楚如何将字符串传递到hmac.new节中,以生成此处的哈希值:
SECRET_KEY = 'SECRET KEY FOR YOUR ADMINISTRATOR'
secret_key = SECRET_KEY
def create_signature(data_to_sign, secret_key):
digest = hmac.new(secret_key.decode("base64"), data_to_sign, digestmod=hashlib.sha1).digest()
return base64.encodestring(digest).rstrip()
尝试按原样运行此命令会导致“ LookupError,'base64'不是文本编码;请使用codecs.decode()处理任意编解码器”
我试图通过使用
将变量转换为该函数之前或内部的字节。 base64.b64decode
或bytes(secret_key)
函数,但是导致“ TypeError,必须在散列之前对Unicode对象进行编码”,而我只是没有找到很多有关如何获取字符串变量以传递给hmac.new()的信息。
我很确定这与python 2和3之间的变化有关,其中字符串作为unicode存储在3中,而字符串则作为原始数据存储在2中,但是我对这些编码不够熟悉,无法理解如何正确翻译它们通过时
答案 0 :(得分:1)
错误消息告诉您您需要做什么:
shouldComponentUpdate()
要编码Unicode对象(即TypeError, Unicode-objects must be encoded before hashing
),只需调用其encode
方法。
您必须确定所需的编码。通常,这是UTF-8。如果您使用的是现代Python 3,请确保默认为UTF-8,因此只需编写以下代码即可:
str
如果要使用其他编码(或者,如果要使用UTF-8,但使用的是旧版Python),请明确指定:
secret_key_bytes = secret_key.encode()
答案 1 :(得分:1)
只需考虑bytes
和str
是什么?
编辑:根据docs for hmac.new
和the hashlib
module,data_to_sign
也必须为bytes
。
secret_key
是str
->将其转换为bytes
data_to_sign
也可能是str
->将其转换为bytes
base64.b64decode
接受并输出bytes
->不执行任何操作hmac.new
也接受bytes
->我们已经准备好了digest
返回bytes
->我们要b64encode
,并且b64encode
接受bytes
,所以我们很好。str
(尽管bytes
可能很好)-> decode
b64encode
的结果如果要使用不同于默认编码(utf-8)的编码,则还可以为函数提供encoding
参数。
代码:
import base64
def create_signature(data_to_sign: str, secret_key: str, encoding='utf-8') -> str:
secret_key = secret_key.encode(encoding) # convert to bytes
data_to_sign = data_to_sign.encode(encoding) # convert to bytes
secret_key = base64.b64decode(secret_key) # this is still bytes
digest = hmac.new(secret_key, data_to_sign, digestmod=hashlib.sha1).digest() # still bytes
digest_b64 = base64.b64encode(digest) # bytes again
return digest_b64.decode(encoding) # that's now str