首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python HMAC: TypeError:字符映射必须返回整数、无或unicode

Python HMAC: TypeError:字符映射必须返回整数、无或unicode
EN

Stack Overflow用户
提问于 2013-12-31 08:21:55
回答 2查看 16.6K关注 0票数 21

我和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

这个错误是什么意思?是不是因为有新的线路?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-01 03:37:37

如果有人问我,我会把这篇文章作为回答。您遇到的错误是Python的HMAC的一个特性。它不接受unicode。此功能在here中进行了描述。

HMAC是一个工作在字节级的函数。因此,在Python3中,它只接受bytes。在Python2中,我们没有bytes,所以它只接受str

票数 43
EN

Stack Overflow用户

发布于 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')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20849805

复制
相关文章

相似问题

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