如何在PHP中使用Android Java HMAC SHA256?

如何在PHP中使用Android Java HMAC SHA256?,java,php,android,hmac,Java,Php,Android,Hmac,我有一个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 and

我有一个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平台或设备是否有任何限制?

您正在将输入字符串转换为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;
}

Base64.DEFAULT将在散列的末尾追加一个换行符,这将引发非法字符异常。相反,请使用Base64.NO_WRAP作为您的标志。