英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论