2

我正在尝试创建将在某些站点上运行私有 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__是这里的关键问题。所以我尝试的下一件事是从 decode 函数和 rawToChar 获取原始输出:

str(base64Decode(secret,mode='raw'))
raw [1:64] ee e3 3f be ...

rawToChar(base64Decode(secret,mode='raw'))

rawToChar(base64Decode(secret,mode='raw')) 中的错误:字符串中的嵌入 nul:'îă?ľÂÜĄ\vŽĺ\022\0!^\026Č‹¶©wŚˇ0Î\035ë\026\r\001ňKÍ„Rř\ 003j„7¤Ň\nťä_\004m@ß\0Ă"c\0271˝ZnĚ55'v'

正如我们现在所看到的,在我的(甚至还没有)字符串的某个地方有一个神秘的nul东西。我不太关心nuls,我只需要将这段数据作为hmac的输入传递。

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

我也尝试了 base64enc 包,但没有成功。我尝试了许多不同的转换,但一切都回到了这个简单的“字符串中的 nul”。

这些站点相当新,并且此身份验证过程看起来像是其中的标准 API 身份验证。在 R 中应该有某种方法来处理该过程。

如果有人想测试,

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
4

2 回答 2

2

问题 2. 的答案是:

hmac 函数已经接受原始对象而不是字符串。

这是解决方案:

hmac(key = base64Decode(secret, mode='raw'),
 object = post_data,
 algo = 'sha512',
 raw = TRUE)
于 2013-02-20T09:20:35.167 回答
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函数,而在于脚本的其他地方。

于 2013-02-19T18:04:46.633 回答