R";中的HMAC和换行符错误;摘要;包裹

R";中的HMAC和换行符错误;摘要;包裹,r,hmac,R,Hmac,我正在尝试实现R代码来与Amazon的Alexa Web信息服务接口。身份验证系统要求HMAC根据密钥对文本进行哈希,但当文本包含换行符时,“摘要”包似乎存在问题 R中的最小示例: library(digest) hmac("foo", "Hello", algo="sha256") 返回fa687477a49ebadb72eb1103db6128061437a2501db7ee7f0cbbb79ceaa2fcfc,而 hmac("foo", "Hello\nGoodbye", algo="s

我正在尝试实现R代码来与Amazon的Alexa Web信息服务接口。身份验证系统要求HMAC根据密钥对文本进行哈希,但当文本包含换行符时,“摘要”包似乎存在问题

R中的最小示例:

library(digest)
hmac("foo", "Hello", algo="sha256")
返回fa687477a49ebadb72eb1103db6128061437a2501db7ee7f0cbbb79ceaa2fcfc
,而

hmac("foo", "Hello\nGoodbye", algo="sha256")
返回
eaf58b106ffdbb4af976b6b87e14d231e090f7bc144f0b56f06980c827444288

如果我对照检查,第一个案例给出了相同的散列,但第二个案例给出了
967b28392b2ddc871bb69417e916fa619c935840cc2b9507ecf4da3f748bd1ba

我错过了什么明显的东西吗


提前感谢

欢迎来到精彩的新线世界!在文本中包含换行符时,网站似乎使用windows样式的行尾。所以如果你这样做,你可以得到“967b”的值

hmac("foo","Hello\r\nGoodbye",algo="sha256")
# [1] "967b28392b2ddc871bb69417e916fa619c935840cc2b9507ecf4da3f748bd1ba"
我猜你可能在Mac或linux机器上。我认为
\n
字符应该根据操作系统解析为正确的值。也许在做

hmac("foo","Hello\x0D\x0AGoodbye",algo="sha256")

最好在所有系统的文件中明确说明您需要执行的行结尾。

因此,虽然Flick先生确实回答了我的具体问题,但真正的问题更深刻。整个问题是由Perl的
hmac\u sha256\u base64()
和R之间的分歧引起的

结果证明我用错了R
hmac()
返回十六进制代码,而不是base64,因此需要额外的步骤。但是,
RCurl
中的
base64()
函数似乎需要字节向量,而不是串联字符串。我在下面举例说明

我做错了什么:

我应该做什么(正确):

完全不同,不是吗


后者同意Perl,而且(更重要的是)它实际上在Amazon Web服务上正确地进行身份验证。:-)

是的。这就是这里具体问题的问题,然而,我的问题似乎比这更深。来自Amazon站点()的等效Perl代码没有给出与R相同的东西,即使没有换行符。回到绘图板…所以Perl不同意这个网站,我解决了这个问题:原来我没有正确地进行base64编码。下面是正确的方法:
hmac
在默认情况下是否做了base64编码以外的事情?很抱歉,这让人困惑,因为我没有为您提供实际代码的所有信息。Amazon的示例Perl代码使用
hmac\u sha256\u base64()
来自
Digest::SHA
。在R中,这需要两个步骤:使用
HMAC()
执行HMAC,然后使用base64编码(在我的例子中,使用
RCurl中的
base64()
)。我的问题是我没有使用
raw=t
选项来
hmac()
,因此哈希值与Perl的结果不一致(并且没有在Amazon上进行身份验证…)。
require(digest)
require(RCurl)

> hmac("foo", "Hello", algo="sha256")
[1] "fa687477a49ebadb72eb1103db6128061437a2501db7ee7f0cbbb79ceaa2fcfc"

> base64(hmac("foo", "Hello", algo="sha256"))
[1] "ZmE2ODc0NzdhNDllYmFkYjcyZWIxMTAzZGI2MTI4MDYxNDM3YTI1MDFkYjdlZTdmMGNiYmI3OWNlYWEyZmNmYw=="
attr(,"class")
[1] "base64"
> hmac("foo", "Hello", algo="sha256", raw = T)
[1] fa 68 74 77 a4 9e ba db 72 eb 11 03 db 61 28 06 14 37 a2 50 1d b7 ee 7f 0c bb b7 9c ea a2 fc fc

> base64(hmac("foo", "Hello", algo="sha256", raw = T))
[1] "+mh0d6Seutty6xED22EoBhQ3olAdt+5/DLu3nOqi/Pw="
attr(,"class")
[1] "base64"