【问题标题】:How make Android Java HMAC SHA256 as in PHP?如何在 PHP 中制作 Android Java HMAC SHA256?
【发布时间】:2017-06-13 04:37:49
【问题描述】:

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

【问题讨论】:

    标签: java php android hmac


    【解决方案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;
    }
    

    【讨论】:

    • Base64.DEFAULT 将在哈希末尾追加一个换行符,这将引发非法字符异常。相反,使用 Base64.NO_WRAP 作为你的标志。
    猜你喜欢
    • 2021-05-05
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2023-03-18
    • 2012-07-10
    • 2019-10-11
    相关资源
    最近更新 更多