我正在使用
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.