使用 Python 实现 SHA1-HMAC
Implementing SHA1-HMAC with Python
我正在为 python (v 3.7) 实现 SHA1-HMAC 生成,以便能够创建 HMAC 代码。
我使用了一个 online generator to create SHA1-HMAC 和以下数据:
- 字符串:
'123'
- 密钥:
'secret'
- 摘要算法:
SHA1
我得到这个结果:
b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7
然而,当我尝试对 Python 执行相同操作时,我得到了不同的错误结果。
import hashlib
import hmac
import base64
def make_digest(message, key):
key = bytes(key, 'UTF-8')
message = bytes(message, 'UTF-8')
digester = hmac.new(key, message, hashlib.sha1)
signature1 = digester.digest()
signature2 = base64.urlsafe_b64encode(signature1)
return str(signature2, 'UTF-8')
result = make_digest('123', 'secret')
print(result)
此代码给出结果:
sU6S6xf2t47FogXuDhqyIPt_htc=
这段代码可能有什么问题?
你不应该在这里使用Base64。您 link 访问的站点为您提供摘要字节的 十六进制值 。使用 HMAC.hexdigest()
method 在 Python:
中获得相同的十六进制值
>>> key = b'secret'
>>> message = b'123'
>>> digester = hmac.new(key, message, hashlib.sha1)
>>> digester.hexdigest()
'b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7'
换句话说,您的代码输出正确的值,但作为 Base64 编码的数据:
>>> digester.digest()
b'\xb1N\x92\xeb\x17\xf6\xb7\x8e\xc5\xa2\x05\xee\x0e\x1a\xb2 \xfb\x7f\x86\xd7'
>>> base64.urlsafe_b64encode(digester.digest())
b'sU6S6xf2t47FogXuDhqyIPt_htc='
并且您在线生成的值包含与十六进制摘要完全相同的字节,因此我们可以为此生成相同的 base64 输出:
>>> bytes.fromhex('b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7')
b'\xb1N\x92\xeb\x17\xf6\xb7\x8e\xc5\xa2\x05\xee\x0e\x1a\xb2 \xfb\x7f\x86\xd7'
>>> base64.urlsafe_b64encode(bytes.fromhex('b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7'))
b'sU6S6xf2t47FogXuDhqyIPt_htc='
我正在为 python (v 3.7) 实现 SHA1-HMAC 生成,以便能够创建 HMAC 代码。
我使用了一个 online generator to create SHA1-HMAC 和以下数据:
- 字符串:
'123'
- 密钥:
'secret'
- 摘要算法:
SHA1
我得到这个结果:
b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7
然而,当我尝试对 Python 执行相同操作时,我得到了不同的错误结果。
import hashlib
import hmac
import base64
def make_digest(message, key):
key = bytes(key, 'UTF-8')
message = bytes(message, 'UTF-8')
digester = hmac.new(key, message, hashlib.sha1)
signature1 = digester.digest()
signature2 = base64.urlsafe_b64encode(signature1)
return str(signature2, 'UTF-8')
result = make_digest('123', 'secret')
print(result)
此代码给出结果:
sU6S6xf2t47FogXuDhqyIPt_htc=
这段代码可能有什么问题?
你不应该在这里使用Base64。您 link 访问的站点为您提供摘要字节的 十六进制值 。使用 HMAC.hexdigest()
method 在 Python:
>>> key = b'secret'
>>> message = b'123'
>>> digester = hmac.new(key, message, hashlib.sha1)
>>> digester.hexdigest()
'b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7'
换句话说,您的代码输出正确的值,但作为 Base64 编码的数据:
>>> digester.digest()
b'\xb1N\x92\xeb\x17\xf6\xb7\x8e\xc5\xa2\x05\xee\x0e\x1a\xb2 \xfb\x7f\x86\xd7'
>>> base64.urlsafe_b64encode(digester.digest())
b'sU6S6xf2t47FogXuDhqyIPt_htc='
并且您在线生成的值包含与十六进制摘要完全相同的字节,因此我们可以为此生成相同的 base64 输出:
>>> bytes.fromhex('b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7')
b'\xb1N\x92\xeb\x17\xf6\xb7\x8e\xc5\xa2\x05\xee\x0e\x1a\xb2 \xfb\x7f\x86\xd7'
>>> base64.urlsafe_b64encode(bytes.fromhex('b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7'))
b'sU6S6xf2t47FogXuDhqyIPt_htc='