2013-02-19 196 views
2

我試圖創建將在一些網站上運行私有API調用的函數。base64解碼 - 字符串中的nul

base64_encode(hash_hmac('sha512', $post_data, base64_decode($secret), true)) 

使用包摘要和RCurl我可以很容易地爲寫:

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

我打整天與 所有這些網站在PHP如下使用認證通過API調用的簽名在HMAC 參數輸入:

key = base64Decode(secret) 

的問題是,HMAC函數只接受字符串值,但base64Decode可能返回的東西不僅僅是字符串更多:

str(base64Decode(secret)) 
chr "îă?ľÂÜĄ\vŽĺ\022""| __truncated__ 

__truncated__是這裏的關鍵問題。所以,我一直在嘗試,接下來的事情就是採取從解碼功能和rawToChar原始輸出就可以了:

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

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

錯誤rawToChar(base64Decode(祕密,模式=「原始」)):嵌入 NUL字符串:?! 「IAľÂÜĄ\ VZL \ 022 \ 0^\026Č<¶©wŚ0Î\ 035E \ 026 \ r \001ňKÍ「RR \ 003j「7¤Ň\nťä_\004米@ß\ 0A「C:\0271˝ ZnĚ55'v」

正如我們現在可以看到,有一個神祕的NUL東西的地方在我的(甚至沒有)的字符串。我不那麼在意NUL s,我只需要傳遞這些數據作爲hmac的輸入。

  1. 有沒有可能用nul處理字符串,只是爲了將它作爲輸入上位函數推得更遠?
  2. 是否有可能有HMAC功能參數接受原始對象也是這樣嗎?

我也試過base64enc包沒有成功。我嘗試了許多不同的轉換,但是一切都恢復了這個簡單的'字符串'。

這些網站是相當新的,這個認證過程看起來像其中一個標準的API身份驗證。應該有某種方式來處理R.

這個過程如果有人想測試,

secret <- '7uM/vsLcpQuOmOUSACFeFsiLtql3jKEwzh3rFg0B8kvNhFL4A2qEN6TSCp3kXwRtQN8AwyJjFzG9Wm7MNTWSdg==' 
+0

我得到了同樣的問題。由於某些原因,base64Decode在輸出到字符時截斷結果... – bumpkin 2015-02-03 02:28:22

+0

@bumpkin使用'raw'而不是'character'。 – jangorecki 2015-02-04 20:30:28

+0

這就是我最終做的。謝謝! – bumpkin 2015-02-04 21:00:31

回答

2

回答的問題2.爲:

HMAC功能已經接受原始對象,而不是字符串。

這是解決方案:

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

我真的不知道這屆truncated的問題。當您將str應用於輸出時,您會要求它顯示其結構。這就是它的作用:

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

chr意味着對象是character類(一個字符串)。 str然後顯示字符串的開始,把它的輸出截斷。因此truncated顯示str。如果你想顯示完整的字符串,只需鍵入其名稱或使用print

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

所以我想,這個問題是不是與base64Decode的功能,但在腳本中的其他地方。

+0

這不是整個字符串,將它傳遞給hmac會產生不同的結果。你能否在其他工具中嘗試使用相同的base64decode,例如php。它會有所不同。或者你可以base64Decode作爲raw並在其上生成rawToChar,然後你會看到整個字符串。 – jangorecki 2013-02-19 18:13:46

+0

@MusX在我的系統上,R和php都給出相同的結果,字符或二進制模式... – juba 2013-02-19 18:22:24

+0

你可以試試'rawToChar(base64Decode(secret,mode ='raw'))'並檢查它是什麼字符串會嘗試返回?正如你在我的帖子中看到的那樣,在錯誤信息中有一個更大的字符串,這個更大的字符串完全被截斷爲「\ 0」字符的位置,如果你是谷歌的「\ 0」,你會發現這是一個**無**字符。弦在截至發生的地方被截斷。 – jangorecki 2013-02-20 07:23:02