2017-06-12 16 views
1

スタックオーバーフローで同じ質問がいくつか表示されましたが、回答が見つかりませんでした。Android JavaとPHP HASH HMAC SHA256の異なる結果

の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。私は言うようにコードを編集しますが、それは私を助けませんでした。私は別の結果を持っている理由を説明してください。

+1

PHPではbase64_encode関数の2倍を使いましたが、Javaでは一度しか使用しませんでした。 – Edwin

+0

私はそれを修正しますが、結果はPHPとAndroid Javaでは異なります。 –

+0

PHPで 'hash_hmac( 'sha256'、$ str、$ key、true)の値を表示できますか? – Edwin

答えて

0

str初期化でbase64を削除するPHPコードに変更!小さなパラメータ:Base64.NO_WRAP私はbase64をbase64からhmacにエンコードします。

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のコードは次のとおりです: ターAndroidのJavaコードがある

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

どちらの結果が正常に動作します! ありがとうございました!

0

あなたはそれを解決するには2つの方法があります:

  1. ラインでbase_encodeを削除する1

    $ strの= 'eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9を';

  2. は、印刷

    プリント(hash_hmac( 'SHA256'、$ strの、$キー、真))でbase_encodeを削除します。

+0

私は試みますが、それは私を助けませんでした。 –

0

違いはPHPでbase64_encodeで初期化$strですが、あなたはhash_mac

中にエンコードしなかったJAVAであなたはBASE64でstrをエンコードする必要があるすべてJavaの前にhash_mac

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

それとも、私がこれを解決し

$str='eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9';

+0

私は試してみますが、私はPHPで別の結果があります。 ((( –

+0

@YaroslavSnisar)私はPHPとJAVA側でテストしているので、 – Zico

+0

はJavaとPHPでうまく動作しますが、Android Javaでは違います! –