python - 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 输出。
提前致谢。
解决方案
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=="
推荐阅读
- cmake - CMake:不同变体满足的库依赖关系
- python-3.x - 在 python 3.8 中使用 ThreadPool 和 pool.map(func, list_on_which_will_func_will_be_applied) 运行多个线程时出现问题
- javascript - 在 Web 应用程序中向用户显示错误消息
- c++ - 当我输入输入时,C++ 窗口就关闭了
- scala - 根据日期条件查找不同的行
- flutter - 从 Firebase 离线数据库中获取数据 (Flutter)
- r - 如何将字符串转换为 R 中的特定时间格式?
- html - 当我更改字体时,导航链接变为垂直而不是水平?
- reactjs - 如何在 Rechart 组件(React)上添加水印?
- node.js - 无法在本地机器上通过 ebcli 运行 docker 容器