英文:
HMAC produces different strings in Python3 vs Golang
问题
我有一个用于计算给定密钥和挑战的hmac的Golang函数。Golang代码如下:
func get_hmac64(psk string, challenge string) string {
mac := hmac.New(sha3.New256, []byte(psk))
mac.Write([]byte(challenge))
macSum := mac.Sum(nil)
var macSumB64 = make([]byte, (len(macSum)*8+5)/6)
base64.URLEncoding.Encode(macSumB64, macSum)
return string(macSumB64)
}
我将其翻译为Python3,如下所示:
def get_hmac64(psk: str, challenge: str) -> str:
"""
这会在Golang和Python3之间为相同的psk和challenge生成不同的字符串
"""
psk_bytes = bytes(psk, "utf-8")
challenge_bytes = bytes(challenge, "utf-8")
mac = hmac.new(psk_bytes, challenge_bytes, hashlib.sha3_256)
mac_digest = mac.digest()
b64_encoded = base64.b64encode(mac_digest)
return b64_encoded.decode("utf-8")
print(get_hmac64("abc", "def"))
对于Python实现,返回的字符串是M1P63mj5ytdYUaJJ4m2UMtEKBgRG/K3AzHCW/TjIS1k=,而对于Go代码,相同密钥和字符串的生成输入是qWISO-QliNl_dwhDBhkd3MaT。
如果key、challenge和hash在不同语言的hmac实现中保持不变,那么返回值不应该相同吗?如果是这样,那么我在Python翻译中漏掉了哪一步?
英文:
I have a Golang function that calculates hmac for a given key and challenge. The go code is
func get_hmac64(psk string, challenge string) string {
mac := hmac.New(sha3.New256, []byte(psk))
mac.Write([]byte(challenge))
macSum := mac.Sum(nil)
var macSumB64 = make([]byte, (len(macSum)*8+5)/6)
base64.URLEncoding.Encode(macSumB64, macSum)
return string(macSumB64)
}
I translated this to Python3 as below.
def get_hmac64(self, psk: str, challenge: str) ->str:
"""
This generates a different string for same psk and challenge between Golang and Python3
"""
psk_bytes = bytes(psk, "utf-8")
challenge_bytes = bytes(challenge, "utf-8")
mac = hmac.new(psk_bytes, challenge_bytes, hashlib.sha3_256)
mac_digest = mac.digest()
b64_encoded = base64.b64decode(mac_digest)
return b64_encoded.decode("utf-8")
print(get_hmac("abc", "def"))
For the python implementation the string returned is M1P63mj5ytdYUaJJ4m2UMtEKBgRG/K3AzHCW/TjIS1k= whereas for the Go code the generated input for the same key and string is qWISO-QliNl_dwhDBhkd3MaT
Shouldnt the value be same if the key, challenge and the hash remains same for the hmac implementation across languages? If so, what is the step that I missed in the Python translation?
答案1
得分: 1
以下代码与您报告的Python代码给出了相同的结果:
func get_hmac64(psk string, challenge string) string {
mac := hmac.New(sha3.New256, []byte(psk))
mac.Write([]byte(challenge))
macSum := mac.Sum(nil)
return base64.StdEncoding.EncodeToString(macSum)
}
(完整代码请参见 https://go.dev/play/p/5lWG-jMfELz)。
两个区别是我使用了 sha3.New256 而不是奇怪的 NewDragonHash,并且通过简单地使用 .EncodeToString() 方法修复了 base64 编码。
英文:
The following code gives the same results as the one you report for your Python code:
func get_hmac64(psk string, challenge string) string {
mac := hmac.New(sha3.New256, []byte(psk))
mac.Write([]byte(challenge))
macSum := mac.Sum(nil)
return base64.StdEncoding.EncodeToString(macSum)
}
(Full code at https://go.dev/play/p/5lWG-jMfELz).
The two differences are that I used sha3.New256 instead of the strange NewDragonHash, and that I fixed the base64 encoding by simply using the .EncodeToString() method.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论