【问题标题】:Python encoding gives incorrect outputPython 编码给出不正确的输出
【发布时间】:2016-02-20 22:38:31
【问题描述】:

下面的编码有问题

import hashlib
import hmac

base_string = "&https%3A%2F%2Fsecure.trademe.co.nz%2FOauth%2FRequestToken&oauth_callback%3Dhttp%253A%252F%252Fwww.website-tm-access.co.nz%252Ftrademe-callback%26oauth_consumer_key%3DC74CD73FDBE37D29BDD21BAB54BC70E422%26oauth_nonce%3D7O3kEe%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1285532322%26oauth_version%3D1.0%26scope%3DMyTradeMeRead%252CMyTradeMeWrite".encode()
KEY = b"3B61C8A3FF9F1F6C0DBE436F9B507E08EF&"

result = hmac.new(KEY, base_string, hashlib.sha256).hexdigest()

print(result)

OUTPUT:
    2d60b698a7d5fb318068b13c8f1bdfb99d241e0d2b4a669c337f84aa694f82dc

我正在尝试遵循这个:

这是我们最终的基本字符串:

POST&https%3A%2F%2Fsecure.trademe.co.nz%2FOauth%2FRequestToken&oauth_callback%3Dhttp%253A%252F%252Fwww.website-tm-access.co.nz%252Ftrademe-callback%26oauth_consumer_key%3DC74CD73FDBE37D29BDD21BAB54BC70E422%26oauth_nonce%3D7O3kEe%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1285532322%26oauth_version%3D1.0%26scope%3DMyTradeMeRead%252CMyTradeMeWrite

要生成签名,我们需要使用 HMAC-SHA1 来加密 带有我们的消费者秘密和访问令牌秘密的基本字符串。正如我们所做的那样 还没有访问令牌,我们只需使用 消费者机密,后跟 & 符号(这是关键)。

3B61C8A3FF9F1F6C0DBE436F9B507E08EF&

基本字符串和密钥都应使用以下方法转换为二进制 UTF8 编码。生成结果 MAC 后,应该是 使用标准 base-64 编码转换回文本形式。在 在这个例子中,我们得到以下字符串,它成为我们的签名 为这个请求。

5s3+el078a5AXGi43FBDyfg5yWY=

【问题讨论】:

    标签: python api encoding


    【解决方案1】:

    Python 代码和示例代码都是正确的,它们被赋予不同的输入字符串,使用不同的 SHA 函数并产生不同的输出数据编码。

    1. 第一个示例base_string 缺少前四个字符:“POST”。
    2. SHA256 和 SHA1 是两个不同的函数,第一个产生 32 字节的输出,第二个产生 20 字节的输出。
    3. 第一个输出是 32 个十六进制编码字节,第二个输出是 20 个 Base64 编码字节。这与输出相匹配。

    您需要小心使所有内容都匹配。

    【讨论】:

    • 谢谢 :) 考虑使用类似这样的结果 result = base64.b64encode(hmac.new(KEY, base_string, hashlib.sha1)).digest() 但我确定它需要字节而不是 HMAC对吗?
    • 我的猜测会是这样的:hmac.new(KEY, base_string, hashlib.sha1).base64()。脚本语言和密码学的问题在于它们往往不能很好地支持原始字节字符串,并且加密在数学上是基于原始字节的。另一个问题是 SHA1 不应该用于新工作,而应使用 SHA256。
    • 是的,出于某种原因,它似乎不喜欢使用 sha1……我难住了哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多