我正在尝试编写一些函数来使用 AWS 版本 4 签名协议连接到 IBM Cloud Object Storage。这里有一些在 Python 中工作的样板代码,但是当我尝试将代码转换为 RI 时,发现自己陷入了难题。
在 R & Python 中使用 HMAC 函数时,该.hexdigest()
方法在两种语言中为相同的字符串产生相同的输出:
# Python
import hmac
import hashlib
>>> hmac.new("key", "message".encode('utf-8'), hashlib.sha256).hexdigest()
'6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a
# R
library(digest)
> hmac("key", enc2utf8("message"), "sha256")
[1] "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a"
如果您使用库.digest()
中 Python 中的方法(crypto
AWS/IBM 的代码建议使用该方法),那么您将获得 ASCII 输出。我可以通过将hmac()
输出更改为原始然后转换为字符来近似 R 中的这个 ASCII 输出。您可以在下面看到它并不完全相同 - 尽管它很接近。
# Python
>>> hmac.new("key", "message".encode('utf-8'), hashlib.sha256).digest()
"n\x9e\xf2\x9bu\xff\xfc[z\xba\xe5'\xd5\x8f\xda\xdb/\xe4.r\x19\x01\x19v\x91sC\x06_X\xedJ"
# R
> rawToChar(hmac("key", "message", "sha256", raw = T))
[1] "n\x9e\xf2\x9bu\xff\xfc[z\xba\xe5'Տ\xda\xdb/\xe4.r\031\001\031v\x91sC\006_X\xedJ"
是什么导致了这里的差异? 的源代码和文档.digest()
说它返回一个可能包含非 ASCII 字节的 8 位数据字符串。 如何在 R 中复制此输出?
最终,我相信这是导致我在尝试使用 IBM Cloud Object Storage 进行身份验证时签名失败的原因。对于 Python/R 中的 HMAC 库的任何帮助或替代建议将不胜感激!