2012-06-21 60 views
1

我試圖將PHP後端與Java後端集成。 Java後端需要一些必須正確編碼和哈希以在兩端匹配的憑證。HMAC一個php字節數組

java系統將字符串轉換爲字節序列(1),然後生成該序列(2)的HMAC/SHA256密鑰散列,然後基數64對散列(3)進行編碼。

private static final String HMAC_ALGORITHM = "HmacSHA256"; 
final SecretKey key = new SecretKeySpec('mysecret', HMAC_ALGORITHM); 
final Mac hmac = Mac.getInstance(key.getAlgorithm()); 
hmac.init(key); 
final String stringToHash = "blablabla"; 
final byte[] bytesToHash = stringToHash.getBytes("UTF8"); 
final byte[] hash = hmac.doFinal(bytesToHash); 
return Base64.encodeBytes(hash); 

我可以做的(1),用PHP中的字符串轉換爲字節序列

$stringArray = unpack('C*', $string); 

//其工作,並在這一點上是完全一樣的Java系統

但是第二部分(2)似乎不匹配,有沒有辦法將一個字節數組傳遞給PHP中的hmac,因爲在Java中,HMAC方法接受一個字節數組,而PHP的方法期望一個字符串,例如

hash_hmac('sha256', $stringArray, $secret); 

或者我需要循環訪問數組並做一些魔術?

謝謝!

+0

添加你的Java和PHP代碼 – Josnidhin

+0

薩姆嗨,面臨着同樣的問題。你找到解決方案嗎? – dirtyhandsphp

回答

1

我不認爲你需要unpack在PHP

試試看

hash_hmac('sha256', $string, $secret, TRUE); 

注:我傳遞的實際字符串的函數,最後PARAM raw_output設置爲TRUE

更新

Java代碼似乎是錯誤docs

final SecretKey key = new SecretKeySpec('mysecret', HMAC_ALGORITHM); 

這應該是像下面

byte[] keyBytes = mysecret.getBytes(); // say mysecret is a String var 
final SecretKey key = new SecretKeySpec(keyBytes, HMAC_ALGORITHM); 
+0

沒有喜悅不幸的是,結果不同之間的PHP和Java – sam

+0

可以添加Java和PHP代碼 – Josnidhin

+0

Java:private static final String HMAC_ALGORITHM =「HmacSHA256」; final String stringToHash =「blablabla」; final byte [] bytesToHash = stringToHash.getBytes(「UTF8」); final byte [] hash = hmac.doFinal(bytesToHash); return Base64.encodeBytes(hash); – sam