String base64解码-字符串中的nul

String base64解码-字符串中的nul,string,r,base64,digest,rcurl,String,R,Base64,Digest,Rcurl,我正在尝试创建一个函数,该函数将在某些站点上运行私有API调用。 所有这些站点都在使用php中API调用的签名身份验证,如下所示: base64_encode( hash_hmac('sha512', $post_data, base64_decode($secret), true) ) 使用package digest和RCurl,我可以轻松地编写为: base64Encode( hmac(key = base64Decode(secret), object = post_data, alg

我正在尝试创建一个函数,该函数将在某些站点上运行私有API调用。 所有这些站点都在使用php中API调用的签名身份验证,如下所示:

base64_encode( hash_hmac('sha512', $post_data, base64_decode($secret), true) )
使用package digest和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__
这是这里的关键问题。因此,我尝试的下一件事是从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èèèèèèèèèèèèèèëèèèë026\r\001ňKÍèrêêèèèèè

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

  • 是否有可能使用nul处理字符串,只是为了将其作为输入上限函数推得更远
  • 有没有可能让hmac函数参数接受这样的原始对象
  • 我也尝试了base64enc包,但没有成功。我尝试了许多不同的转换,但一切都回到了这个简单的“字符串中的nul”

    这些站点都是比较新的,这个身份验证过程看起来像是其中一个标准的API身份验证

    如果有人想测试

    secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg=='
    

    secret我真的不确定被截断的
    是否是问题所在。当您将
    str
    应用于输出时,您要求它显示其结构。它就是这样做的:

    chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__
    
    chr
    表示对象为类
    字符(字符串)。
    str
    然后显示字符串的开头,put截断其输出。因此
    str
    显示的
    截断的
    。如果要显示完整的字符串,只需键入其名称或使用
    print

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

    secret问题2的答案是:

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

    这就是解决方案:

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

    这不是整个字符串,将其传递给hmac将产生不同的结果。请您在其他工具(例如php)中尝试相同的Base64解码。它将不同。或者您可以将Base64解码为原始并在其上生成rawToChar,然后您将看到整个字符串。@MusX在我的系统中,R和php都给出相同的结果,无论是字符还是格式二进制模式…请尝试
    rawToChar(base64Decode(secret,mode='raw'))
    并检查它将尝试返回什么字符串?正如您在我的帖子中看到的,错误消息中有一个更大的字符串,如果您搜索“\0”,这个更大的字符串将在“\0”字符所在的位置被截断“你会发现这是一个nul角色。字符串在nul出现的地方被截断了。我也遇到了同样的问题。base64Decode出于某种原因在输出到character时截断结果…@bumpkin使用
    raw
    而不是
    character
    。这就是我最后要做的。谢谢