簡體   English   中英

Android Java和PHP HASH HMAC SHA256不同的結果

[英]Android Java and PHP HASH HMAC SHA256 different result

我在堆棧溢出中看到了一些相同的問題,但是找不到答案。

Android Java:

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();
    }

結果:

UHWlHiPrOxxncJTagnlvVcln3xKZ1PKaojFeTMDLXws=

並在PHP代碼中:

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

結果:

FBp7PnSG4MQNgcFWAjjlkxNdiqivrmNfnRZur1Dko2Q=

如您所見,我有不同的結果。 我做錯了什么?

PS。 正如我們所說,我編輯代碼,但對我沒有幫助。 請解釋一下,為什么我會有不同的結果?

您有2種解決方法:

  1. 刪除第1行中的base_encode

    $ STR = 'eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9';

  2. 刪除打印中的base_encode

    打印(hash_hmac('sha256',$ str,$ key,true));

區別在於PHP $str使用base64_encode初始化,但是在JAVA中,您沒有在hash_mac期間進行編碼

hash_mac之前,需要在base64 中用 JAVA中str編碼的所有代碼

private String hash_hmac(String str, String secret) {
        String ss = Base64.encodeToString(str.getBytes("UTF-8"));
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
        sha256_HMAC.init(secretKey);
        String hash1 = Base64.encodeToString(sha256_HMAC.doFinal(ss.getBytes("UTF-8")));
        return hash1;
}

或者只是更改PHP代碼以刪除str初始化中的base64

$str='eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9';

我解決了! 小參數:當我將base64字節編碼為base64到hmac時,Base64.NO_WRAP。 Android Java代碼是:

private String hash_hmac_test(String base_string, String key) throws Exception {

    try {
        Mac mac = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret = new SecretKeySpec(key.getBytes("UTF-8"), mac.getAlgorithm());
        mac.init(secret);

        String base_string_base64 = Base64.encodeToString(base_string.getBytes(), Base64.NO_WRAP);

        byte[] digest = mac.doFinal(base_string_base64.getBytes());
        //android.util.Base64.encodeT
        String retVal = Base64.encodeToString(digest,Base64.DEFAULT);

        Log.v(TAG, "String: " + base_string);


        Log.v(TAG, "String in Base64: " + base_string_base64);

        Log.v(TAG, "key: " + key);
        Log.v(TAG, "result: " + retVal);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    return "ok";
}

在PHP中的代碼是:

base64_encode(hash_hmac('sha256', base64_encode($str), $key,true))

兩種結果都很好! 感謝你所做的一切!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM