2011-03-18 134 views
2

我試圖使用Web服務提供者的API。他們在Ruby中沒有例子,但是他們確實有一個用於PHP的例子,我試圖在兩者之間進行解釋。 API的例子總是在PHP的hash_hmac()調用中使用「true」,它會產生一個二進制輸出。差異似乎是Ruby的OpenSSL :: HMAC.hexdigest()函數總是返回文本。 (如果我將PHP調用更改爲「false」,它們會返回相同的值。)有誰知道如何對從OpenSSL :: HMAC.hexdigest()返回的文本進行「編碼」以獲得與從hash_hmac返回的內容相同的內容('sha256',$ text,$ key,true)?獲取Ruby的OpenSSL :: HMAC.hexdigest()輸出與PHP的hash_hmac()相同

回答

5

使用OpenSSL::HMAC.digest來獲取二進制輸出。

+0

當然,我有史以來第一次直接進入Ruby手冊,以揭示如何將十六進制字符轉換爲字節,並且從未想過實際上看待所討論的類。使用這個,不是我的。 :) – Charles 2011-03-18 20:23:51

+2

@Charles - 我也是,但是我搜索了'digest',找到了它,然後盯着它幾分鐘,想知道爲什麼在意識到OP使用'hexdigest'之前不工作:) – aaz 2011-03-18 20:30:53

+0

,至少我現在不覺得那麼糟糕,因爲它也錯過了。 ;-) – 2011-03-21 13:41:41

1

您需要將每對十六進制數字轉換爲具有相同值的字節。我不知道任何Ruby,但這與在PHP中如何處理它類似。

首先,取出您的十六進制數字串並將它們拆分成一個數組。數組中的每個元素應該是兩個字符長。將每個元素從一個兩個十六進制字節的字符串轉換爲一個整數。看起來你可以通過在每個字符串上調用hex方法來做到這一點。

接下來,使用參數c*在轉換的數組上調用pack,將每個整數轉換爲單字節字符。你應該得到正確的字節串作爲結果。