【问题标题】:Python and Java MAC SHA256 encoding generating VERY SIMILAR KEYPython 和 Java MAC SHA256 编码生成非常相似的密钥
【发布时间】:2016-07-08 04:04:59
【问题描述】:

我正在使用Java 创建一个签名请求(SHA256base64)并在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_secreturl 在两种语言中具有相同的输入(JavaPython

我错过了什么?

【问题讨论】:

    标签: java python base64 sha256 hmac


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多