2013-02-19 223 views
2

我试图创建将在一些网站上运行私有API调用的函数。base64解码 - 字符串中的nul

base64_encode(hash_hmac('sha512', $post_data, base64_decode($secret), true)) 

使用包摘要和RCurl我可以很容易地为写:

base64Encode(hmac(key = base64Decode(secret), object = post_data, algo = 'sha512', raw = TRUE)) 

我打整天与 所有这些网站在PHP如下使用认证通过API调用的签名在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(秘密,模式=“原始”)):嵌入 NUL字符串:?! “IAľÂÜĄ\ VZL \ 022 \ 0^\026Č<¶©wŚ0Î\ 035E \ 026 \ r \001ňKÍ“RR \ 003j“7¤Ň\nťä_\004米@ß\ 0A“C:\0271˝ ZnĚ55'v”

正如我们现在可以看到,有一个神秘的NUL东西的地方在我的(甚至没有)的字符串。我不那么在意NUL s,我只需要传递这些数据作为hmac的输入。

  1. 有没有可能用nul处理字符串,只是为了将它作为输入上位函数推得更远?
  2. 是否有可能有HMAC功能参数接受原始对象也是这样吗?

我也试过base64enc包没有成功。我尝试了许多不同的转换,但是一切都恢复了这个简单的'字符串'。

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

这个过程如果有人想测试,

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg==' 
+0

我得到了同样的问题。由于某些原因,base64Decode在输出到字符时截断结果... – bumpkin 2015-02-03 02:28:22

+0

@bumpkin使用'raw'而不是'character'。 – jangorecki 2015-02-04 20:30:28

+0

这就是我最终做的。谢谢! – bumpkin 2015-02-04 21:00:31

回答

2

回答的问题2.为:

HMAC功能已经接受原始对象,而不是字符串。

这是解决方案:

hmac(key = base64Decode(secret, mode='raw'), 
object = post_data, 
algo = 'sha512', 
raw = TRUE) 
1

我真的不知道这届truncated的问题。当您将str应用于输出时,您会要求它显示其结构。这就是它的作用:

chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__ 

chr意味着对象是character类(一个字符串)。 str然后显示字符串的开始,把它的输出截断。因此truncated显示str。如果你想显示完整的字符串,只需键入其名称或使用print

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg==' 
str(base64Decode(secret)) 
# chr "\xee\xe3?\xbe\xc2ܥ\v\x8e\x98\xe5\022" 

所以我想,这个问题是不是与base64Decode的功能,但在脚本中的其他地方。

+0

这不是整个字符串,将它传递给hmac会产生不同的结果。你能否在其他工具中尝试使用相同的base64decode,例如php。它会有所不同。或者你可以base64Decode作为raw并在其上生成rawToChar,然后你会看到整个字符串。 – jangorecki 2013-02-19 18:13:46

+0

@MusX在我的系统上,R和php都给出相同的结果,字符或二进制模式... – juba 2013-02-19 18:22:24

+0

你可以试试'rawToChar(base64Decode(secret,mode ='raw'))'并检查它是什么字符串会尝试返回?正如你在我的帖子中看到的那样,在错误信息中有一个更大的字符串,这个更大的字符串完全被截断为“\ 0”字符的位置,如果你是谷歌的“\ 0”,你会发现这是一个**无**字符。弦在截至发生的地方被截断。 – jangorecki 2013-02-20 07:23:02