Python 蟒蛇3号和hmac。如何处理不是二进制的字符串

Python 蟒蛇3号和hmac。如何处理不是二进制的字符串,python,string,python-3.x,encoding,hmac,Python,String,Python 3.x,Encoding,Hmac,我用Python2编写了一个脚本,效果非常好 def _generate_signature(data): return hmac.new('key', data, hashlib.sha256).hexdigest() 其中数据是json.dumps的输出 现在,如果我尝试在Python 3中运行相同类型的代码,我会得到以下结果: Traceback (most recent call last): File "<stdin>", line 1, in <modu

我用Python2编写了一个脚本,效果非常好

def _generate_signature(data):
   return hmac.new('key', data, hashlib.sha256).hexdigest()
其中数据是
json.dumps
的输出

现在,如果我尝试在Python 3中运行相同类型的代码,我会得到以下结果:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/hmac.py", line 144, in new
    return HMAC(key, msg, digestmod)
  File "/usr/lib/python3.4/hmac.py", line 42, in __init__
    raise TypeError("key: expected bytes or bytearray, but got %r" %type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'
我明白了

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:没有编码的字符串参数

我仍在努力理解Python 3中的编码。

您可以使用bytes literal:
b'key'

def _generate_signature(data):
    return hmac.new(b'key', data, hashlib.sha256).hexdigest()

除此之外,确保
数据
也是字节。例如,如果从文件中读取,则在打开文件时需要使用二进制模式(
rb

def _generate_signature(data):
    return hmac.new(b'key', data, hashlib.sha256).hexdigest()

除此之外,确保
数据
也是字节。例如,如果它是从文件中读取的,则在打开文件时需要使用
binary
模式(
rb
)。

不想重新提出一个旧问题,但我确实想添加一些我认为此答案中缺少的内容,我很难找到其他地方的适当解释/示例:

阿奎尔斯·卡拉蒂诺(Aquiles Carattino)尝试将字符串转换为字节,但他错过了第二个参数,即要转换为字节的字符串的编码

如果有人希望通过静态分配以外的其他方式(如从配置文件或数据库读取)将字符串转换为字节,则以下操作应有效:

(仅限Python 3+,与Python 2不兼容)


我不是想重提一个老问题,但我确实想补充一点,我觉得这个答案遗漏了一些东西,我很难找到其他地方的适当解释/例子:

阿奎尔斯·卡拉蒂诺(Aquiles Carattino)尝试将字符串转换为字节,但他错过了第二个参数,即要转换为字节的字符串的编码

如果有人希望通过静态分配以外的其他方式(如从配置文件或数据库读取)将字符串转换为字节,则以下操作应有效:

(仅限Python 3+,与Python 2不兼容)

试一试

codecs.encode()

可在python2.7.12和3.5.2中使用

import hashlib
import codecs
import hmac

a = "aaaaaaa"
b = "bbbbbbb"
hmac.new(codecs.encode(a), msg=codecs.encode(b), digestmod=hashlib.sha256).hexdigest()
试试看

codecs.encode()

可在python2.7.12和3.5.2中使用

import hashlib
import codecs
import hmac

a = "aaaaaaa"
b = "bbbbbbb"
hmac.new(codecs.encode(a), msg=codecs.encode(b), digestmod=hashlib.sha256).hexdigest()


如何为参数使用字节文字?在字符串文字前面加前缀
b
'key'
:string,
b'key'
:bytes。我仍然会遇到类似这样的错误:
TypeError:Unicode对象必须在散列之前进行编码
@Tessaracter,您使用的是Python 2.x吗?然后对数据进行编码,
hmac.new(b'key',data.encode('utf-8'),hashlib.sha256).hexdigest()
(相应地更改
utf-8
)@false。不,我正在使用Python3.6如何使用bytes literal作为参数?在string literal前面加前缀
b
'key'
:string,
b'key'
:bytes。我仍然会遇到类似这样的错误:
TypeError:Unicode对象必须在散列之前进行编码
@Tessaracter,您使用的是Python 2.x吗?然后对数据进行编码,
hmac.new(b'key',data.encode('utf-8'),hashlib.sha256).hexdigest()
(相应地更改
utf-8
)@false。不,我使用的是Python3.6请注意,如果代码在Python2.7包中,但从Python3调用,则此解决方案将不起作用。这是因为在Python2中,
bytes
builtin只是
str
的别名。我可以通过将字符串强制转换为在两种语言版本中都有效的ByteArray来编写从python 2或3运行的函数。^true dat,仅限python 3。请注意,如果代码在python 2.7包中,但从python 3调用,则此解决方案将不起作用。这是因为在Python2中,
bytes
builtin只是
str
的别名。我可以通过将字符串强制转换为在两种语言版本中都有效的ByteArray来编写一个从python 2或python 3运行的函数。^true dat,仅限python 3。我得到了这个结果
TypeError:在散列之前必须对Unicode对象进行编码
<代码>类型错误:必须在哈希之前对Unicode对象进行编码
工作日期2021年3月。谢谢。2021年3月工作。非常感谢。
import hashlib
import codecs
import hmac

a = "aaaaaaa"
b = "bbbbbbb"
hmac.new(codecs.encode(a), msg=codecs.encode(b), digestmod=hashlib.sha256).hexdigest()