OpenSSL HMAC与Python HMAC的区别

5

使用:

KEY='7vgd39eyxald9sucClM7'
DATA='POST\nmultipart/form-data\nWed, 10 Jun 2015 07:27:43 GMT\n/1/classes/item\nx-wbs-uid:f886a495220975d724ff3679a5cc9cef04343076'

在命令行中
HASH_BIN=`echo -n "$DATA" | openssl dgst -sha256 -mac HMAC -macopt key:$KEY -binary`
openssl enc -e -base64 <<< $HASH_BIN
result: VmBdzRcNg0OJZVVLSgg1zcViflug9iqtb6Gsnjqf9F8K

在Python中
import hmac, hashlib, base64
hash = hmac.new(KEY, DATA, hashlib.sha256).digest()
base64.encodestring(hash).strip()
result: u6Poj7Jqrz6+wvXDNyK88pVm5iKUF6RUmq2P2LtHmuE=

有人可以帮我吗?非常感谢。


请您粘贴完整的Python代码,包括KEY和DATA定义? - Eric Tsui
好问题。我做了实验,发现与你相同的问题。当我尝试使用不带 '\n' 的不同和简单的 DATA 字符串时,openssl 和 python 可以产生相同的结果。因此,我发现问题是由 python 中字符串定义引起的。 - Eric Tsui
1个回答

6

这可能是由于您Python代码中DATA字符串的定义引起的。

您需要添加r,将DATA视为原始字符串,例如:

DATA=r'POST\nmultipart/form-data\nWed, 10 Jun 2015 07:27:43 GMT\n/1/classes...'

使用r,可以忽略掉DATA中的所有转义字符。也就是说,'\n'将被视为换行符,但r'\n'将被视为后面跟着n的字符。在Python中,

'\n'  // 0x0d

r'\n' // 0x5c 0x6e 

使用 r 参数,输出结果与通过 OpenSSL 输出的结果相等。

VmBdzRcNg0OJZVVLSgg1zcViflug9iqtb6Gsnjqf9F8K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接