使用 HMAC-SHA256 的 Python 编码消息

Posted

技术标签:

【中文标题】使用 HMAC-SHA256 的 Python 编码消息【英文标题】:Python encoded message with HMAC-SHA256 【发布时间】:2016-11-03 04:08:19 【问题描述】:

我尝试根据instructions在python中使用HMAC-SHA256编码消息

import hmac
import hashlib

nonce = 1234
customer_id = 123232
api_key = 2342342348273482374343434
API_SECRET = 892374928347928347283473

message = nonce + customer_id + api_key
signature = hmac.new(
    API_SECRET,
    msg=message,
    digestmod=hashlib.sha256
).hexdigest().upper()

但我明白了

Traceback(最近一次调用最后一次):文件“gen.py”,第 13 行,在 digestmod=hashlib.sha256 文件“/usr/lib/python2.7/hmac.py”,第 136 行,新 return HMAC(key, msg, digestmod) File "/usr/lib/python2.7/hmac.py", line 71, in init if len(key) > blocksize: TypeError: 'long' 类型的对象没有 len()

有人知道为什么会崩溃吗?

【问题讨论】:

【参考方案1】:

您正在使用 api 需要字符串/字节的数字。

# python 2
import hmac
import hashlib

nonce = 1234
customer_id = 123232
api_key = 2342342348273482374343434
API_SECRET = 892374928347928347283473

message = '  '.format(nonce, customer_id, api_key)
signature = hmac.new(
    str(API_SECRET),
    msg=message,
    digestmod=hashlib.sha256
).hexdigest().upper()

print signature

【讨论】:

【参考方案2】:

如果你想在 python3 中执行,你应该执行以下操作:

#python 3
import hmac
import hashlib

nonce = 1
customer_id = 123456
API_SECRET = 'thekey'
api_key = 'thapikey'

message = '  '.format(nonce, customer_id, api_key)

signature = hmac.new(bytes(API_SECRET , 'latin-1'), msg = bytes(message , 'latin-1'), digestmod = hashlib.sha256).hexdigest().upper()
print(signature)

【讨论】:

为什么使用 latin-1? signature = hmac.new(bytes(API_SECRET , 'utf-8'), msg = bytes(message , 'utf-8'), digestmod = hashlib.sha256).hexdigest().upper()

以上是关于使用 HMAC-SHA256 的 Python 编码消息的主要内容,如果未能解决你的问题,请参考以下文章

hmac-sha256 2021-11-02

HMAC-SHA256 - 怎么样?

对接微信支付使用HMAC-SHA256使用签名算法实现方式

php PHP和ASP.NET HMAC-SHA256签名

SHA256

Bitstamp - C# 中的新身份验证 - 签名