【问题标题】:How to use SHA256-HMAC in python code?如何在 python 代码中使用 SHA256-HMAC?
【发布时间】:2017-02-07 14:27:03
【问题描述】:

I am taking message and key from this URL

import hmac
import hashlib
import base64
my = "/api/embedded_dashboard?data=%7B%22dashboard%22%3A7863%2C%22embed%22%3A%22v2%22%2C%22filters%22%3A%5B%7B%22name%22%3A%22Filter1%22%2C%22value%22%3A%22value1%22%7D%2C%7B%22name%22%3A%22Filter2%22%2C%22value%22%3A%221234%22%7D%5D%7D"
key = "e179017a-62b0-4996-8a38-e91aa9f1"
print(hashlib.sha256(my + key).hexdigest())

我得到了这个结果:

2df1d58a56198b2a9267a9955c31291cd454bdb3089a7c42f5d439bbacfb3b88

预期结果:

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740

【问题讨论】:

  • 你把它用于潜望镜数据嵌入api吧?

标签: python oauth sha256 hmac


【解决方案1】:

您的代码中根本没有使用hmac

使用hmac 的典型方式,根据您的密钥、消息构造一个 HMAC 对象,并通过传入其构造函数来识别哈希算法:

h = hmac.new( key, my, hashlib.sha256 )
print( h.hexdigest() )

应该输出

adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740

为您的示例数据。

【讨论】:

    【解决方案2】:

    给你一些代码,好用:

    import hmac
    import hashlib
    import binascii
    
    def create_sha256_signature(key, message):
        byte_key = binascii.unhexlify(key)
        message = message.encode()
        return hmac.new(byte_key, message, hashlib.sha256).hexdigest().upper()
    
    create_sha256_signature("E49756B4C8FAB4E48222A3E7F3B97CC3", "TEST STRING")
    

    【讨论】:

      【解决方案3】:

      Wilson WU 的回答说明,如果 key 和 messages 都是十六进制,则返回值是错误的,只需更改下面的代码行即可解决该问题;

      message = message.encode() ---> message = message.binascii.unhexlify(message)

      【讨论】:

      • 也只是密钥是十六进制的,你需要取消十六进制。谢谢你。花几天时间。
      【解决方案4】:

      可能为时已晚。然而,发布对我有用的东西以防万一它适用于其他人 -

      import hmac
      import hashlib
      import base64
      
      access_token = <your token in string format>
      app_secret = <your secret access key in string format>
      
      # use any one, all three options work.
      # OPTION 1 (it works)
      # digest = hmac.new(app_secret.encode('UTF-8'),
      #                   access_token.encode('UTF-8'), hashlib.sha256)
      # OPTION 2 (it works)
      # digest = hmac.new(str.encode(app_secret),
      #                   str.encode(access_token), hashlib.sha256)
      # OPTION 3 (it works)
      digest = hmac.new(bytes(app_secret, 'UTF-8'),
                      bytes(access_token, 'UTF-8'), hashlib.sha256)
      signature = digest.hexdigest()
      print(signature)
      

      【讨论】:

        【解决方案5】:

        对于更高版本的 python,您需要混合所有其他答案才能获得 OP 输出。 hmac.new 函数希望key 参数的类型为bytesbytearray,因此在Neil Slater's answer 中运行代码会产生以下错误:

        TypeError: key: expected bytes or bytearray, but got 'str'

        即使key 参数已修复,hmac.new 函数也会抱怨my 字符串并出现以下错误:

        TypeError: Unicode 对象必须在散列之前进行编码

        为了解决这两个问题,Sujoy's answer 中的 bytes 函数和 Wilson Wu's answer 中的 encode 方法用于将变量转换为正确的类型。

        import hashlib
        import hmac
        
        # my and key as per question
        my = "/api/embedded_dashboard?data=%7B%22dashboard%22%3A7863%2C%22embed%22%3A%22v2%22%2C%22filters%22%3A%5B%7B%22name%22%3A%22Filter1%22%2C%22value%22%3A%22value1%22%7D%2C%7B%22name%22%3A%22Filter2%22%2C%22value%22%3A%221234%22%7D%5D%7D"
        key = "e179017a-62b0-4996-8a38-e91aa9f1"
        
        # encoding as per other answers
        byte_key = bytes(key, 'UTF-8')  # key.encode() would also work in this case
        message = my.encode()
        
        # now use the hmac.new function and the hexdigest method
        h = hmac.new(byte_key, message, hashlib.sha256).hexdigest()
        
        # print the output
        print(h)
        

        这个打印的输出是

        adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740
        

        完全符合 OP 的预期。

        【讨论】:

          猜你喜欢
          • 2016-11-03
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-19
          • 1970-01-01
          • 2016-10-25
          • 2020-08-29
          相关资源
          最近更新 更多