首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将字符串转换为Python3中hmac.new()的字节对象

将字符串转换为Python3中hmac.new()的字节对象
EN

Stack Overflow用户
提问于 2018-07-20 03:25:21
回答 1查看 3.2K关注 0票数 1

来自https://www.mimecast.com/developer/documentation/downloading-siem-logs/的代码示例显示了一个脚本,该脚本可用于从Python2.7中的服务下载日志。

我正在更新脚本,以便与Python3兼容,但我不知道如何将字符串传递到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.b64decodebytes(secret_key)

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-07-20 03:32:17

错误消息将告诉您需要执行的操作:

TypeError, Unicode-objects must be encoded before hashing

要对Unicode对象(即str)进行编码,只需调用它的encode方法。

你必须决定你想要什么编码。通常,这是UTF-8。如果你使用的是现代的Python3,那么UTF-8肯定是默认的,所以你可以这样写:

secret_key_bytes = secret_key.encode()

如果您想要不同的编码(或者如果您想要UTF-8,但使用的是较旧的Python),请显式指定:

secret_key_bytes = secret_key.encode('Latin-1')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51430424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档