我和HMAC有点小问题。在运行这段代码时:
signature = hmac.new(
key=secret_key,
msg=string_to_sign,
digestmod=sha1,
)
我得到一个奇怪的错误:
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hmac.py", line 133, in new
return HMAC(key, msg, digestmod)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hmac.py", line 72, in __init__
self.outer.update(key.translate(trans_5C))
TypeError: character mapping must return integer, None or unicode
当我打印string_to_sign时,它是如下所示的正确字符串:
GET
\n
\n
application/json
\n
\n
\n
这个错误是什么意思?是不是因为有新的线路?
发布于 2014-01-01 03:37:37
如果有人问我,我会把这篇文章作为回答。您遇到的错误是Python的HMAC的一个特性。它不接受unicode。此功能在here中进行了描述。
HMAC是一个工作在字节级的函数。因此,在Python3中,它只接受bytes
。在Python2中,我们没有bytes
,所以它只接受str
。
发布于 2018-04-02 18:40:06
在python 2中
如果您将其编码为:
from __future__ import unicode_literals
import base64
import hashlib
import hmac
import time
def gen_signature(key, strsome, expires=0):
expires = int(time.time()) + 600 if expires == 0 else expires
_2_signature = '%s\n%s\n' % (expires, strsome)
# hmac.new(key, msg, digestmod) bytearray(secret, 'utf-8')
signature = base64.b64encode(hmac.new(key, _2_signature, hashlib.sha1).digest())
return signature
gen_signature('xxxxxxx', 'strsome')
您会得到一个与您提供的错误类似的错误。但是,如果您使用bytearray(key, 'utf-8')
代替原始键变量,使用bytearray(_2_signature, 'utf-8')
代替_2_signature变量,它应该可以正常工作。
例如:
def gen_signature(key, strsome, expires=0):
expires = int(time.time()) + 600 if expires == 0 else expires
_2_signature = '%s\n%s\n' % (expires, strsome)
# hmac.new(key, msg, digestmod) bytearray(secret, 'utf-8')
signature = base64.b64encode(hmac.new(bytearray(key, 'utf-8'), bytearray(_2_signature, 'utf-8'), hashlib.sha1).digest())
return signature
gen_signature('xxxxxxx', 'strsome')
https://stackoverflow.com/questions/20849805
复制相似问题