Python 和 Java MAC SHA256 编码生成非常相似的密钥
Python and Java MAC SHA256 encoding generating VERY SIMILAR KEY
我正在使用 Java
创建签名请求(SHA256
和 base64
)并在 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_secret
和 url
在两种语言中具有相同的输入(Java
和 Python
)
我错过了什么?
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
.
我正在使用 Java
创建签名请求(SHA256
和 base64
)并在 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_secret
和 url
在两种语言中具有相同的输入(Java
和 Python
)
我错过了什么?
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
.