【问题标题】:openssl hmac differ from python hmacopenssl hmac 与 python hmac 不同
【发布时间】:2015-09-07 13:23:36
【问题描述】:

与:

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 定义?
  • 好问题。我做了实验,发现和你一样的问题。当我尝试使用不同且更简单的 DATA 字符串(不带 '\n')时,openssl 和 python 可以产生相同的结果。所以我发现问题是由python中的字符串定义引起的。

标签: python openssl hmac


【解决方案1】:

这应该是由您的 python 代码中的DATA 字符串定义引起的。

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

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

使用rDATA 中的所有转义码都将被忽略。也就是说,'\n' 将被视为换行符,而 r'\n' 将被视为 \ 后跟 n 的字符。在 Python 中,

'\n'  // 0x0d

r'\n' // 0x5c 0x6e 

使用r,它将输出等于通过openssl输出的结果,

VmBdzRcNg0OJZVVLSgg1zcViflug9iqtb6Gsnjqf9F8K

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2016-02-07
    • 1970-01-01
    • 2012-10-12
    • 2012-07-20
    • 2018-12-06
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多