R 中的 HMAC 编码与 Python
HMAC Encoding in R vs Python
我正在尝试为 R 中的 API 调用创建令牌。我在 Python 中有示例代码和输出,但我无法在 R 中复制。我几乎一无所知关于编码、解码等。希望有人能阐明我可以做些什么来使这些输出匹配。这是一个玩具示例。
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 输出。
提前致谢。
R 中的 digest()
函数与 python 中的 .digest()
方法不同。它不会提取值,它会为您传入的任何内容计算一个新的摘要。此外,hmac
函数默认情况下会 return 一个包含字节的字符串,但您想要 base64 编码实际字节,因此您需要确保请求原始值。最后,一个 base64 字符串应该有 4 个字符的倍数。额外的填充似乎 return 不同的值。所以这应该给出与 python code
相同的值
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=="
我正在尝试为 R 中的 API 调用创建令牌。我在 Python 中有示例代码和输出,但我无法在 R 中复制。我几乎一无所知关于编码、解码等。希望有人能阐明我可以做些什么来使这些输出匹配。这是一个玩具示例。
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 输出。
提前致谢。
R 中的 digest()
函数与 python 中的 .digest()
方法不同。它不会提取值,它会为您传入的任何内容计算一个新的摘要。此外,hmac
函数默认情况下会 return 一个包含字节的字符串,但您想要 base64 编码实际字节,因此您需要确保请求原始值。最后,一个 base64 字符串应该有 4 个字符的倍数。额外的填充似乎 return 不同的值。所以这应该给出与 python code
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=="