HMAC和R" digest"中的换行符出错包

时间:2014-07-02 00:36:22

标签: r hmac

我正在尝试实现R代码以与Amazon的Alexa Web信息服务进行交互。身份验证系统要求HMAC对密钥进行文本哈希处理,但是"摘要"当文本包含换行符时打包。

R中的最小例子:

library(digest)
hmac("foo", "Hello", algo="sha256")

返回fa687477a49ebadb72eb1103db6128061437a2501db7ee7f0cbbb79ceaa2fcfc,而

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

返回eaf58b106ffdbb4af976b6b87e14d231e090f7bc144f0b56f06980c827444288

如果我检查http://www.freeformatter.com/hmac-generator.html,第一个案例会提供相同的哈希值,但第二个案例会给出967b28392b2ddc871bb69417e916fa619c935840cc2b9507ecf4da3f748bd1ba

我错过了一些明显的东西吗?

提前致谢!!!

2 个答案:

答案 0 :(得分:11)

所以,虽然MrFlick确实回答了我的具体问题,但真正的问题更深层次。整个问题是由Perl的hmac_sha256_base64()和R。

之间的分歧引起的

事实证明我错误地使用了R. hmac()返回十六进制代码,而不是base64,因此需要执行其他步骤。但是,base64()中的RCurl函数似乎需要一个字节向量,而不是一个连接的字符串。我在下面说明。

我在做什么(错误):

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"

相当不同,没有?

后者同意Perl,并且(更重要的是)它实际上在Amazon Web Services上正确验证。 : - )

答案 1 :(得分:2)

欢迎来到新线的精彩世界!当您在文本中包含换行符时,网站似乎使用了Windows样式行结尾。所以你可以得到那个" 967b"如果你做的话

hmac("foo","Hello\r\nGoodbye",algo="sha256")
# [1] "967b28392b2ddc871bb69417e916fa619c935840cc2b9507ecf4da3f748bd1ba"

我猜你可能在Mac或Linux机器上。我认为\n字符应该根据操作系统解析为正确的值。也许正在做

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

可能更好地明确你需要在所有系统上的文件中结束的行。