base64 decode - 字符串中的nul

时间:2013-02-19 17:51:58

标签: string r base64 digest rcurl

我正在尝试创建将在某些网站上运行私有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的输入。

  1. 是否有可能用nul处理字符串,只是为了将其作为输入上部函数推得更远?
  2. 是否有可能让hmac函数 key 参数接受这样的原始对象?
  3. 我也试过base64enc包但没有成功。我尝试了很多不同的转换,但是所有内容都回到了这个简单的'nul in string'。

    这些网站相当新,这个身份验证过程看起来像是其中的标准API身份验证。在R中应该有一些方法来处理这个过程。

    如果有人想测试,

    secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
    

2 个答案:

答案 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函数,而在于脚本中的其他地方。