Go Hmac SHA1生成与Java中的Hmac SHA1不同的哈希

问题描述:

我刚刚开始学习Go,并试图将现有的小型应用程序从Java重写为Go。Go Hmac SHA1生成与Java中的Hmac SHA1不同的哈希

我需要使用Hmac SHA1算法创建带密钥的输入字符串Base64哈希值。

我的Java代码:

private String getSignedBody(String input, String key) { 
    String result = ""; 
    try { 
     SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA1"); 
     Mac mac = Mac.getInstance("HmacSHA1"); 
     mac.init(signingKey); 
     byte[] rawHmac = mac.doFinal(input.getBytes("UTF-8")); 
     result = Base64.encodeToString(rawHmac, false); 
    } catch (Exception e) { 
     Logger.error("Failed to generate signature: " + e.getMessage()); 
    } 
    return result; 
} 

我的Go代码:

func GetSignature(input, key string) string { 
    key_for_sign := []byte(key) 
    h := hmac.New(sha1.New, key_for_sign) 
    h.Write([]byte(input)) 
    return base64.StdEncoding.EncodeToString(h.Sum(nil)) 
} 

的问题是,Go代码生成未预期的输出。例如,对于输入字符串"qwerty"和密钥"key",Java输出将为RiD1vimxoaouU3VB1sVmchwhfhg=,Go输出将为9Cuw7rAY671Fl65yE3EexgdghD8=

我在Go代码中犯了什么错误?

+0

可否请您提供输出两个'java'和'go'两个键和字符串是空的:''“'和'”“'? –

您提供的Go代码给出了与Java代码完全相同的输出。

试一下吧Go Playground

输出:

RiD1vimxoaouU3VB1sVmchwhfhg= 

你所犯的错误时,你叫你GetSignature()功能。这样称呼它链接的示例代码:

fmt.Println(GetSignature("qwerty", "key")) 

你的错误是,你传递了一个空的输入您GetSignature()功能。空""输入和"key"键调用它产生你所提供的非预期输出:

fmt.Println(GetSignature("", "key")) 

输出:

9Cuw7rAY671Fl65yE3EexgdghD8= 
+0

感谢您的帮助) –