php base64_encode hash_hmac和java给出了不同的结果

时间:2015-11-27 05:49:36

标签: java php encoding base64 sha256

我在堆栈溢出中看到了一些相同的问题,但它对我没有帮助。

我有这个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;
}

但他们给出了不同的结果。 有人帮忙。

2 个答案:

答案 0 :(得分:1)

Apache Commons Codec

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

答案 1 :(得分: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 =