【发布时间】:2013-02-04 12:38:52
【问题描述】:
我正在尝试创建将在某些站点上运行私有 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参数输入:
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的输入即可。
- 是否有可能使用 nul 处理字符串,只是为了将其作为输入上层函数推得更远?
- 是否有可能让 hmac 函数 key 参数接受这样的原始对象?
我也尝试过 base64enc 包,但没有成功。我尝试了许多不同的转换,但一切都回到了这个简单的“字符串中的 nul”。
这些网站相当新,而且这个身份验证过程看起来像是其中的标准 API 身份验证。应该有一些方法可以在 R 中处理该过程。
如果有人想测试,
secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
【问题讨论】:
-
我遇到了同样的问题。由于某种原因,base64Decode 在输出到字符时会截断结果...
-
@bumpkin 使用
raw而不是character。 -
这就是我最终所做的。谢谢!
标签: string r base64 digest rcurl