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

我正在使用
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()返回一个字符串,因此encode只是
standard encode method.根据
standard encodings的列表,指定base64作为编码意味着将使用
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.

点赞