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

Python和Java MAC SHA256编码生成非常相似的密钥,java,python,base64,sha256,hmac,Java,Python,Base64,Sha256,Hmac,我正在使用Java创建一个签名请求(SHA256和base64),并在Python中验证该请求。我生成的键非常相似: 爪哇: Python: UjuGTll3GF7H8MHWyJc41NAEcd+OZOeJLT9PiAevcsw 唯一的区别发生在char+和char-上。我无法更改java代码,因为我无法访问它,我只知道它使用javax.crypto.Mac。但是,我的python代码是: import hmac import hashlib hmac.new(api_secret, url,

我正在使用
Java
创建一个签名请求(
SHA256
base64
),并在
Python
中验证该请求。我生成的键非常相似:

爪哇:

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\u secret
url
在两种语言中的输入相同(
Java
Python

我缺少什么?

digest()
返回一个字符串,因此
encode
只是一个字符串。根据列表,指定
base64
作为将要使用的编码方式。该函数使用的字母表包括
+
/
,这是标准Base64字母表中的最后两个字符:

>>> base64.encodestring(chr(248))
'+A==\n'
如果您想要使用
-
-
而不是
+
/
的编码字符串,则需要使用:

所以你需要做一些类似的事情:

base64.urlsafe_b64encode(hmac.new(api_secret, url, hashlib.sha256).digest())
但是,要使其正常工作,您需要检查Java代码是否也在生成
\uu
,而不是
//code>,如
urlsafe\ub64encode

>>> base64.urlsafe_b64encode(chr(248))
'-A=='
base64.urlsafe_b64encode(hmac.new(api_secret, url, hashlib.sha256).digest())