首页 > 解决方案 > R 与 Python 中的 HMAC 编码

问题描述

我正在尝试为 R 中的 API 调用创建一个令牌。我在 Python 中有示例代码和输出,但我无法在 R 中复制。我对编码、解码等几乎一无所知。希望有人能有所启发关于我可以做些什么来使这些输出匹配。这是一个玩具示例。

代码:

library(RCurl)
library(digest)

api_key = "abcdefghijklmnopqrstuvwxyz123456789=="
decoded_api_key = base64Decode(api_key)
hmac_binary = hmac(decoded_api_key, "MySpecialString", "sha512")
hmac_encoded = base64Encode(digest(hmac_binary))
print(as.character(hmac_encoded))
# ZmZjZDBlMjkyNzg3NDNmYWM1ZDcyNjVkNmY4ZmM1OGQ=

Python:

import hmac
import hashlib
import base64

api_key = "abcdefghijklmnopqrstuvwxyz123456789=="
decoded_api_key = base64.b64decode(api_key)
hmac_binary = hmac.new(decoded_api_key, "MySpecialString", hashlib.sha512)
hmac_encoded = base64.b64encode(hmac_binary.digest())
print(hmac_encoded)
# MduxNfXVkwcOtCpBWJEl96S43boYVYTtHb4waR21ARCMo6iokKuxbwEJMTkuytbrCOxvBqKCYiaZiV/AyHTEcw==

我得到的答案在代码块的末尾给出。显然他们不匹配。我希望有人帮我更改我的 R 代码以匹配 Python 输出。

提前致谢。

标签: pythonrhmac

解决方案


R 中的digest()函数与.digest()python 中的方法不同。它不会提取值,它会为您传入的任何内容计算一个新的摘要。此外,该hmac函数默认情况下会返回一个包含字节的字符串,但您希望对实际字节进行 base64 编码,因此您需要确保请求原始值。最后,base64 字符串中应包含 4 个字符的倍数。额外的填充似乎返回了不同的值。所以这应该给出与python代码相同的值

api_key = "abcdefghijklmnopqrstuvwxyz123456789="
decoded_api_key = base64Decode(api_key)
hmac_binary = hmac(decoded_api_key, "MySpecialString", "sha512", raw=TRUE)
hmac_encoded = base64Encode(hmac_binary)
print(as.character(hmac_encoded))
# [1] "MduxNfXVkwcOtCpBWJEl96S43boYVYTtHb4waR21ARCMo6iokKuxbwEJMTkuytbrCOxvBqKCYiaZiV/AyHTEcw=="

推荐阅读