【问题标题】:base64 decode - nul in stringbase64 解码 - 字符串中的 nul
【发布时间】: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的输入即可。

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

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

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

如果有人想测试,

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='

【问题讨论】:

  • 我遇到了同样的问题。由于某种原因,base64Decode 在输出到字符时会截断结果...
  • @bumpkin 使用raw 而不是character
  • 这就是我最终所做的。谢谢!

标签: string r base64 digest rcurl


【解决方案1】:

第2题的答案是:

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

这是解决方案:

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

【讨论】:

    【解决方案2】:

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

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

    chr 表示对象属于character 类(字符串)。 str 然后显示字符串的开头,put 截断它的输出。因此 truncatedstr 显示。如果要显示完整的字符串,只需输入其名称或使用print

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

    所以我认为问题不在于base64Decode 函数,而在于脚本的其他地方。

    【讨论】:

    • 这不是整个字符串,将它传递给 hmac 会产生不同的结果。您能否在其他工具中尝试相同的 base64decode,例如 php。它会有所不同。或者您可以将 base64Decode 作为 raw 并在其上制作 rawToChar,然后您将看到整个字符串。
    • @MusX 在我的系统上,R 和 php 在字符或二进制模式下都给出相同的结果...
    • 您能试试rawToChar(base64Decode(secret,mode='raw')) 并检查它将尝试返回什么字符串吗?正如你在我的帖子中看到的,错误消息中有一个更大的字符串,这个更大的字符串在“\0”字符所在的位置被截断,如果你用谷歌搜索“\0”,你会发现这是一个 nul 字符。并且字符串在出现 nul 的地方被截断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多