Python 和 Java MAC SHA256 编码生成非常相似的密钥

Python and Java MAC SHA256 encoding generating VERY SIMILAR KEY

我正在使用 Java 创建签名请求(SHA256base64)并在 Python 中验证此请求。我生成的密钥非常相似:

Java:

UjuGTll3GF7H8MHWyJc41NAEcd-OZOeJLT9PiAevcsw

Python :

UjuGTll3GF7H8MHWyJc41NAEcd+OZOeJLT9PiAevcsw

唯一的区别在于 char + 和 char -。我无法更改 java 代码,因为我无权访问它,我只知道它使用 javax.crypto.Mac。但是,我的 python 代码是:

import hmac
import hashlib
hmac.new(api_secret, url, hashlib.sha256).digest().encode('base64')

变量 api_secreturl 在两种语言中具有相同的输入(JavaPython

我错过了什么?

digest() returns 一个字符串,所以 encode 只是 standard encode method. According to the list of standard encodings, specifying base64 as the encoding means that base64.encodestring 将被使用。该函数使用的字母表包括 +/,它们是标准 Base64 字母表中的最后两个字符:

>>> base64.encodestring(chr(248))
'+A==\n'

如果你想要一个使用 -_ 而不是 +/ 的编码字符串,你需要使用 base64.urlsafe_b64encode:

>>> base64.urlsafe_b64encode(chr(248))
'-A=='

因此您需要执行以下操作:

base64.urlsafe_b64encode(hmac.new(api_secret, url, hashlib.sha256).digest())

不过,要使其正常工作,您需要检查 Java 代码是否也在生成 _ 而不是 /,例如 urlsafe_b64encode.