2017-06-13 190 views
2

我有PHP代碼:如何使PHP Java HMAC SHA256與PHP一樣?

$str=base64_encode('1234'); 
$key='1234'; 
print(base64_encode(hash_hmac('sha256', $str, $key,true))); 

什麼代碼爲Android的Java(Android Studio中)?

該代碼給出不同的結果,在PHP:

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Base64; 
import android.util.Log; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

private String hash_hmac(String str, String secret) throws Exception{ 
Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); 
byte[] string = str.getBytes(); 
String stringInBase64 = Base64.encodeToString(string, Base64.DEFAULT); 
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); 
sha256_HMAC.init(secretKey); 
String hash = Base64.encodeToString(sha256_HMAC.doFinal(stringInBase64.getBytes()), Base64.DEFAULT); 
return hash; 
} 

String str = "1234"; 
String key = "1234"; 

try { 

    Log.d("HMAC:", hash_hmac(str,key)); 

} catch (Exception e) { 
    Log.d("HMAC:","stop"); 
    e.printStackTrace(); 
} 

但在本地Java它工作正常。 ?我解決不了這個( 也許對於Android平臺或設備的任何限制

回答

1

你是你輸入的字符串轉換爲base64,這就是爲什麼它不匹配這裏是正確的代碼 -

private String hash_hmac(String str, String secret) throws Exception{ 
Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); 

SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); 
sha256_HMAC.init(secretKey); 
String hash = Base64.encodeToString(sha256_HMAC.doFinal(str.getBytes()), Base64.DEFAULT); 
return hash; 
}