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

时间:2017-06-12 07:14:32

标签: java php base64 hmac

我在堆栈溢出中看到了一些相同的问题,但它找不到答案。

Android Java:

UHWlHiPrOxxncJTagnlvVcln3xKZ1PKaojFeTMDLXws=

结果:

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

PHP 代码中:

FBp7PnSG4MQNgcFWAjjlkxNdiqivrmNfnRZur1Dko2Q=

结果:

    import turtle

smiles = turtle.Turtle()
smiles.penup()
smiles.goto(-75,150)
smiles.pendown()
smiles.circle(10)     #eye one

#angry
smiles.penup()
smiles.goto(-55,170)
smiles.pendown()
smiles.goto(-85, 190)


smiles.penup()
smiles.goto(75, 150)
smiles.pendown()
smiles.circle(10)     #eye two

#angry
smiles.penup()
smiles.goto(55, 170)
smiles.pendown()
smiles.goto(85, 190)

smiles.penup()
smiles.goto(0,50)
smiles.pendown()
smiles.circle(-100, 90)   #right smile

smiles.penup()
smiles.setheading(180) # <-- look West
smiles.goto(0,50)
smiles.pendown()
smiles.circle(100, 90)

turtle.done()

如您所见,我有不同的结果。我做错了什么?

PS。正如我们所说,我编辑代码,但它没有帮助我。请解释一下为什么我会有不同的结果?

3 个答案:

答案 0 :(得分:0)

您有2种方法可以解决它:

  1. 删除第1行中的base_encode

    $ STR =&#39; eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9&#39 ;;

  2. 删除print

    中的base_encode

    print(hash_hmac(&#39; sha256&#39;,$ str,$ key,true));

答案 1 :(得分:0)

  

差异在于使用$str初始化的 PHP 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 代码即可删除base64初始化中的str

$str='eyJoYXNoIjoic29tZVJlcUhhc2hTdHIiLCJhbnN3ZXIiOnRydWV9';

答案 2 :(得分:0)

我解决了这个问题!小参数:Base64.NO_WRAP当我将base64字节编码为base64到hmac时。 Tha 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))

两个结果都很好! 谢谢大家!