2015-11-27 109 views
2

我在堆棧溢出中看到了一些相同的問題,但它對我沒有幫助。php base64_encode hash_hmac和java給出了不同的結果

我有這樣的PHP代碼

$signature=base64_encode(hash_hmac("sha256", trim($xmlReq), $signature_key, True)); 

我想寫的java等同於,這是我的Java代碼。

public static String encodeXML(String key, String data) { 
    String result = ""; 
    try { 
     Mac mac = Mac.getInstance("HmacSHA256"); 
     SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); 
     mac.init(secretKeySpec); 
     result = Base64.encodeBase64String(mac.doFinal(data.getBytes("UTF-8"))); 
    } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) { 
     log.error("exception occured when encording HmacSHA256 hash"); 
    } 
    return result; 
} 

但他們給出了不同的結果。 有人幫忙。

回答

1

阿帕奇共享編解碼器

import org.apache.commons.codec.binary.Base64; 
.... 
Base64.encodeBase64String(.....); 
0

PHP測試代碼:

$signature=base64_encode(hash_hmac("sha256", 'Message', 'secret', true)); 
echo $signature; 

的Java測試代碼:

import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

import java.util.Base64; 
public class TestJava { 

    public static void main(String[] args) { 
     try { 
     String secret = "secret"; 
     String message = "Message"; 

     Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); 
     SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); 
     sha256_HMAC.init(secret_key); 

     Base64.Encoder encoder = Base64.getEncoder(); 
     String hash = encoder.encodeToString(sha256_HMAC.doFinal(message.getBytes())); 
     System.out.println(hash); 
    } catch (Exception e){ 
     System.out.println("Error"); 
    } 
    } 
} 

輸出兩個應該是: qnR8UCqJggD55PohusaBNviGoOJ67HC6Btry4qXLVZc =

+0

Base64.Encoder是在Java 8中。如何使用Java 7做到這一點? –

+1

使用[Apache Commons Codec](http://commons.apache.org/proper/commons-codec/) – jasonlam604

+0

謝謝,它工作。 :) –

相關問題