2015-05-15 162 views
2

我剛剛開始學習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'兩個鍵和字符串是空的:''「'和'」「'? –

回答

9

您提供的Go代碼給出了與Java代碼完全相同的輸出。

試一下吧Go Playground

輸出:

RiD1vimxoaouU3VB1sVmchwhfhg= 

你所犯的錯誤時,你叫你GetSignature()功能。這樣稱呼它鏈接的示例代碼:

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

你的錯誤是,你傳遞了一個空的輸入您GetSignature()功能。空""輸入和"key"鍵調用它產生你所提供的非預期輸出:

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

輸出:

9Cuw7rAY671Fl65yE3EexgdghD8= 
+0

感謝您的幫助) –