gpt4 book ai didi

python - 将 String 转换为 Python 3 中 hmac.new() 的 Bytes 对象

转载 作者:行者123 更新时间:2023-12-02 03:32:29 33 4
gpt4 key购买 nike

来自 https://www.mimecast.com/developer/documentation/downloading-siem-logs/ 的代码示例显示可用于从 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.b64解码bytes(secret_key)

函数,但这会导致“TypeError,Unicode 对象必须在散列之前编码”,而且我只是没有找到很多关于如何将字符串变量传递到 hmac.new() 的信息。

我很确定这与 python 2 和 3 之间的变化有关,其中字符串在 3 中存储为 unicode,而在 2 中它是原始数据,但我对这些编码不够熟悉,无法理解如何正确翻译传递它们时它们

最佳答案

想一想 bytes 是什么什么是str :

编辑:根据docs for hmac.new the hashlib module , data_to_sign也必须是 bytes .

  1. secret_keystr -> 将其转换为 bytes
  2. data_to_sign可能是 str以及 -> 将其转换为 bytes
  3. base64.b64decode接受并输出 bytes -> 什么都不做
  4. hmac.new接受 bytes也是 -> 我们已经准备好了
  5. digest返回 bytes -> 我们想要 b64encode它,和b64encode接受 bytes , 所以我们很好
  6. 你想输出一个str (尽管 bytes 可能很好)-> decode b64encode 的结果

您还可以提供 encoding如果您想使用不同于默认编码 ( utf-8 ) 的编码,您的函数的参数。

代码:

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

关于python - 将 String 转换为 Python 3 中 hmac.new() 的 Bytes 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51430424/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com