如何在Python代码中使用SHA256-HMAC?

问题描述 投票:0回答:6

我正在从此 URL 获取消息和密钥

import hmac
import hashlib
import base64
my = "/api/embedded_dashboard?data=%7B%22dashboard%22%3A7863%2C%22embed%22%3A%22v2%22%2C%22filters%22%3A%5B%7B%22name%22%3A%22Filter1%22%2C%22value%22%3A%22value1%22%7D%2C%7B%22name%22%3A%22Filter2%22%2C%22value%22%3A%221234%22%7D%5D%7D"
key = "e179017a-62b0-4996-8a38-e91aa9f1"
print(hashlib.sha256(my + key).hexdigest())

我得到这个结果:

2df1d58a56198b2a9267a9955c31291cd454bdb3089a7c42f5d439bbacfb3b88

预期结果:

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740
python oauth sha256 hmac
6个回答
47
投票

您的代码中根本没有使用

hmac

使用

hmac
的典型方法,从密钥、消息构造 HMAC 对象,并通过传入其构造函数来识别哈希算法:

h = hmac.new( key, my, hashlib.sha256 )
print( h.hexdigest() )

应该输出

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740

您的示例数据。


42
投票

对于更高版本的 python,您需要混合所有其他答案才能获取 OP 输出。

hmac.new
函数希望
key
参数的类型为
bytes
bytearray
,因此运行Neil Slater的答案中的代码将产生以下错误:

类型错误:键:预期字节或字节数组,但得到“str”

即使

key
参数已修复,
hmac.new
函数也会抱怨
my
字符串并出现以下错误:

类型错误:Unicode 对象必须在散列之前进行编码

为了解决这两个问题,使用

Wilson Wu 的回答
中的 encode 方法将变量转换为正确的类型。

import hashlib
import hmac

# Define my and key as per question
my = "/api/embedded_dashboard?data=%7B%22dashboard%22%3A7863%2C%22embed%22%3A%22v2%22%2C%22filters%22%3A%5B%7B%22name%22%3A%22Filter1%22%2C%22value%22%3A%22value1%22%7D%2C%7B%22name%22%3A%22Filter2%22%2C%22value%22%3A%221234%22%7D%5D%7D"
key = "e179017a-62b0-4996-8a38-e91aa9f1"

# Encode as per other answers
byte_key = key.encode("UTF-8")
message = my.encode()

# Now use the hmac.new function and the hexdigest method
h = hmac.new(byte_key, message, hashlib.sha256).hexdigest()

# Print the output
print(h)

打印的输出是

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740

正如OP所期望的那样。


8
投票

一些代码供您使用,易于使用:

import hmac
import hashlib
import binascii

def create_sha256_signature(key, message):
    byte_key = binascii.unhexlify(key)
    message = message.encode()
    return hmac.new(byte_key, message, hashlib.sha256).hexdigest().upper()

create_sha256_signature("E49756B4C8FAB4E48222A3E7F3B97CC3", "TEST STRING")

1
投票

Wilson WU 的回答的一个注释,如果密钥和消息都是十六进制,则返回的值是错误的,只需更改下面的代码行即可修复该问题;

message = message.encode() ---> message = message.binascii.unhexlify(message)


1
投票

可能为时已晚。然而,发布对我有用的内容,以防万一它对其他人有用 -

import hmac
import hashlib
import base64

access_token = <your token in string format>
app_secret = <your secret access key in string format>

# use any one, all three options work.
# OPTION 1 (it works)
# digest = hmac.new(app_secret.encode('UTF-8'),
#                   access_token.encode('UTF-8'), hashlib.sha256)
# OPTION 2 (it works)
# digest = hmac.new(str.encode(app_secret),
#                   str.encode(access_token), hashlib.sha256)
# OPTION 3 (it works)
digest = hmac.new(bytes(app_secret, 'UTF-8'),
                bytes(access_token, 'UTF-8'), hashlib.sha256)
signature = digest.hexdigest()
print(signature)

0
投票

如果哈希方法无法直接从 hashlib 模块访问,例如

sm3
,请使用以下方法解决

import hmac
import hashlib

h = hmac.new(b'key', msg=b'data', digestmod='sha256')
print(h.hexdigest())
© www.soinside.com 2019 - 2024. All rights reserved.