String base64解码-字符串中的nul
我正在尝试创建一个函数,该函数将在某些站点上运行私有API调用。 所有这些站点都在使用php中API调用的签名身份验证,如下所示: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
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的输入来传递
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
。这就是我最后要做的。谢谢