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())