Python 为 JSON 字符串生成错误的 HMAC SHA256 签名
Python generates wrong HMAC SHA256 signature for JSON string
我正在使用来自 https://filesamples.com/samples/code/json/sample1.json 的 JSON 文件
将此 JSON 字符串作为输入,将字符串 abc123
作为密钥,我尝试使用以下 python 代码生成 HMAC SHA256 签名。
import hmac
import hashlib
import json
secret = 'abc123'
# Contents of sample1.json
message = '''{
"fruit": "Apple",
"size": "Large",
"color": "Red"
}'''
# message = json.dumps(message)
hash = hmac.new(secret.encode(), message.encode(), hashlib.sha256).hexdigest()
print(hash)
我期待 beedda97cf89103141f2e44cbc6241ced093537c499887289b34d5a3ebc90e97
但我得到 2383734eba9903278b5e91766fef3413f35c823090d01196ab5c682af19f4c81
。如果我直接读取 JSON 文件,我会得到一个不同于两者的签名。但根据我的用例,我无法读取 JSON 文件。我必须将内容复制粘贴到代码本身。
我可以通过这个网站得到预期的结果https://www.freeformatter.com/hmac-generator.html and this https://tools.chilkat.io/hmac#macResult。我觉得有些 formatting/encoding 搞砸了,我不知道它是什么!请帮忙。
这是网站的错。它生成错误的 hmac
This网站会给你预期的
2383734eba9903278b5e91766fef3413f35c823090d01196ab5c682af19f4c81
您的代码与站点之间的区别在于 end-of-line 序列:您的代码使用 LF (\n
),而站点使用 CRLF (\r\n
)。
试试这个消息:
message = '''{\r
"fruit": "Apple",\r
"size": "Large",\r
"color": "Red"\r
}'''
你会得到相同的结果。
我正在使用来自 https://filesamples.com/samples/code/json/sample1.json 的 JSON 文件
将此 JSON 字符串作为输入,将字符串 abc123
作为密钥,我尝试使用以下 python 代码生成 HMAC SHA256 签名。
import hmac
import hashlib
import json
secret = 'abc123'
# Contents of sample1.json
message = '''{
"fruit": "Apple",
"size": "Large",
"color": "Red"
}'''
# message = json.dumps(message)
hash = hmac.new(secret.encode(), message.encode(), hashlib.sha256).hexdigest()
print(hash)
我期待 beedda97cf89103141f2e44cbc6241ced093537c499887289b34d5a3ebc90e97
但我得到 2383734eba9903278b5e91766fef3413f35c823090d01196ab5c682af19f4c81
。如果我直接读取 JSON 文件,我会得到一个不同于两者的签名。但根据我的用例,我无法读取 JSON 文件。我必须将内容复制粘贴到代码本身。
我可以通过这个网站得到预期的结果https://www.freeformatter.com/hmac-generator.html and this https://tools.chilkat.io/hmac#macResult。我觉得有些 formatting/encoding 搞砸了,我不知道它是什么!请帮忙。
这是网站的错。它生成错误的 hmac
This网站会给你预期的
2383734eba9903278b5e91766fef3413f35c823090d01196ab5c682af19f4c81
您的代码与站点之间的区别在于 end-of-line 序列:您的代码使用 LF (\n
),而站点使用 CRLF (\r\n
)。
试试这个消息:
message = '''{\r
"fruit": "Apple",\r
"size": "Large",\r
"color": "Red"\r
}'''
你会得到相同的结果。