【问题标题】:Generating a Signature Value in python在 python 中生成签名值
【发布时间】:2020-09-15 04:27:25
【问题描述】:

所以我正在查看的文档说要使用 C# 生成签名值,但是我想在 Python 中完成整个事情是他们给我的信息,但是预期的结果是签名:wpGKFbhcBl+8JLVXGP0QqBooK6dtLBv9bYtI15NXL1U= for SHA256,我回b'YzI5MThhMTViODVjMDY1ZmJjMjRiNTU3MThmZDEwYTgxYTI4MmJhNzZkMmMxYmZkNmQ4YjQ4ZDc5MzU3MmY1NQ=='

有人能指出我正确的方向吗?

var bytesToHash = Encoding.UTF8.GetBytes(TimeStamp.GetUnixTime() + transactionId + apiKey);
string signature = Convert.ToBase64String(GetHashAlgorithm(Algorithm).ComputeHash(bytesToHash));

我的代码:

import hashlib
import base64
epochTime = 1547498533216
transactionId = "07643622"
APIKey = "13f1fd1b-ab2d-4c1f-8e2c-ca61878f2a44"
hash256 = bytes(str(epochTime) + transactionId + APIKey,'utf-8')
print(hash256)
signature = base64.b64encode(bytes(hashlib.sha256(hash256).hexdigest(),'utf-8'))
print(signature)

【问题讨论】:

    标签: python-3.x sha256


    【解决方案1】:

    您唯一的问题是您对hexdigest 进行了编码(一种将每个字节显示为0-9a-f 范围内的两个字符的字符串形式,它将用作base64 的替代方法来制作人类可读的散列,而不是在结合它),而不是digest(SHA256 哈希的原始字节)。变化:

    signature = base64.b64encode(bytes(hashlib.sha256(hash256).hexdigest(),'utf-8'))
    

    到:

    signature = base64.b64encode(hashlib.sha256(hash256).digest())
    

    输出如你所愿:b'wpGKFbhcBl+8JLVXGP0QqBooK6dtLBv9bYtI15NXL1U='

    【讨论】:

      【解决方案2】:

      hexdigest() 仅包含十六进制数字。您需要返回传递的字符串的摘要

      import hashlib
      import base64
      
      epochTime = 1547498533216
      transactionId = "07643622"
      APIKey = "13f1fd1b-ab2d-4c1f-8e2c-ca61878f2a44"
      
      signature = base64.b64encode(hashlib.sha256(
          (str(epochTime) + transactionId + APIKey).encode()
      ).digest())
      
      print( signature.decode() )
      # wpGKFbhcBl+8JLVXGP0QqBooK6dtLBv9bYtI15NXL1U=
      

      【讨论】:

      • 这里不需要hmac 模块(它简化了代码,就是这样);他们唯一的问题是使用hexdigest 而不是digest (您在没有引起注意更改的情况下修复了它,这是避免仅代码答案的原因)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2017-05-20
      • 2016-06-11
      相关资源
      最近更新 更多