我正在尝试创建将在某些网站上运行私有API调用的函数。 所有这些网站都使用API调用签名进行身份验证,如下所示:
base64_encode( hash_hmac('sha512', $post_data, base64_decode($secret), true) )
使用包摘要和RCurl我可以轻松地写为:
base64Encode( hmac(key = base64Decode(secret), object = post_data, algo = 'sha512', raw = TRUE) )
我正在使用hmac 键参数输入一整天:
key = base64Decode(secret)
问题是hmac函数只接受字符串值,但base64Decode可能返回的不仅仅是字符串:
str(base64Decode(secret))
chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__
此 __ truncated __ 是此处的关键问题。所以我接下来要尝试的是解码函数和rawToChar的原始输出:
str(base64Decode(secret,mode='raw'))
raw [1:64] ee e3 3f be ...
rawToChar(base64Decode(secret,mode='raw'))
rawToChar中的错误(base64Decode(secret,mode ='raw')):嵌入式nul in 串: “IA?ľÂÜĄ\ VZL \ 022 \ 0!^ \026Č<¶©wŚ0Î\ 035E \ 026 \ r \001ňKÍ“RR \ 003j“7¤Ň\nťä_\004米@ß\ 0A“C:\0271˝ZnĚ55'v “
正如我们现在所看到的,在我的(甚至还没有)字符串中某处有一个神秘的 nul 。我不太关心nuls,我只需要传递这段数据作为hmac的输入。
我也试过base64enc包但没有成功。我尝试了很多不同的转换,但是所有内容都回到了这个简单的'nul in string'。
这些网站相当新,这个身份验证过程看起来像是其中的标准API身份验证。在R中应该有一些方法来处理这个过程。
如果有人想测试,
secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
答案 0 :(得分:2)
回答问题2.是:
hmac函数已经接受原始对象而不是字符串。
这是解决方案:
hmac(key = base64Decode(secret, mode='raw'),
object = post_data,
algo = 'sha512',
raw = TRUE)
答案 1 :(得分:1)
我真的不确定问题是truncated
。将str
应用于输出时,要求它显示其结构。这就是它的作用:
chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__
chr
表示该对象属于类character
(字符串)。 str
然后显示字符串的开头,put截断其输出。因此truncated
显示str
。如果要显示完整的字符串,只需键入其名称或使用print
:
secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
str(base64Decode(secret))
# chr "\xee\xe3?\xbe\xc2ܥ\v\x8e\x98\xe5\022"
所以我认为问题不在于base64Decode
函数,而在于脚本中的其他地方。