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

Ven*_*aka 3 python oauth sha256 hmac

我正在从此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())
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

2df1d58a56198b2a9267a9955c31291cd454bdb3089a7c42f5d439bbacfb3b88
Run Code Online (Sandbox Code Playgroud)

预期结果:

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740
Run Code Online (Sandbox Code Playgroud)

Nei*_*ter 10

您根本没有使用hmac代码。

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

h = hmac.new( key, my, hashlib.sha256 )
print( h.hexdigest() )
Run Code Online (Sandbox Code Playgroud)

那应该输出

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740
Run Code Online (Sandbox Code Playgroud)

为您的示例数据。


Bil*_*lis 9

对于更高版本的 python,您需要混合所有其他答案才能获得 OP 输出。该hmac.new函数希望key参数为bytesor类型bytearray,因此在Neil Slater 的答案中运行代码会产生以下错误:

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

即使key参数是固定的,该hmac.new函数也会抱怨my字符串并出现以下错误:

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

要解决这两个中,bytes从功能Sujoy的答案encode从方法威尔逊吴的回答用于变量转换成正确的类型。

import hashlib
import hmac

# 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"

# encoding as per other answers
byte_key = bytes(key, 'UTF-8')  # key.encode() would also work in this case
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)
Run Code Online (Sandbox Code Playgroud)

这打印的输出是

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740
Run Code Online (Sandbox Code Playgroud)

完全符合 OP 的预期。


Wil*_* Wu 5

一些代码给你,易于使用:

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")
Run Code Online (Sandbox Code Playgroud)