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

时间:2018-07-19 19:25:21

标签: python

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.b64decodebytes(secret_key)

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

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

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)

只需考虑bytesstr是什么?

编辑:根据docs for hmac.newthe hashlib moduledata_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的结果

如果要使用不同于默认编码(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