簡體   English   中英

Python 3-ASCII轉換為HMAC

[英]Python 3 - ascii to hex for hmac

我遇到問題,不確定如何解釋,但我會盡力而為。

因此,我嘗試通過API進行身份驗證,該API需要獲取以十六進制表示形式提供的網站提供的私鑰(例如,示例令牌為“ 665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569”),並解碼為ascii以創建密鑰哈希,以便我可以將其傳遞給它http標頭,它是身份驗證過程的一部分。

關於python2我可以簡單地

import hashlib
import hmac
import requests


headers = {
           "custom header": hmac.new("665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569".decode("hex"),
                                     msg="whatever",
                                     digestmod=hashlib.sha256).hexdigest()
          }
requests.get("my url", headers=headers)

但是,盡管經過了數小時的谷歌搜索,各種SO帖子以及有關hmac的官方文檔,但我仍無法在python3中使用此工具。

這似乎源於python2和3處理字符串之間的差異。

在運行"665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569".decode("hex") python2中, "665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569".decode("hex")返回此字符串“ f \\ Q_S ?? M-0 V GE i”,並將其傳遞給hmac.new()

我經過搜索后在Python3中嘗試過的東西:

bytes.fromhex('665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569').decode('utf-8')

bytes.fromhex('665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569').decode('ascii')

import binascii
binascii.unhexlify(b"665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569")

但是這些錯誤或輸出不同的返回值,hmac.new()不會接受。 我假設有一個簡單的解決方案,我只是不了解,因為我對p2和p3如何處理字符串的細微差別並不了解。

您的嘗試之一是正確的:

In [1]: import binascii
   ...: binascii.unhexlify(b"665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569")
   ...:
Out[1]: b'f\\ \xb3\xc4Q~\x02S\x11\x16\x0b\x7f\xec?\xdb\x9bM\t\x1f\x14-0\x8cV\x8d\x0e\xecGE\xf5i'

如果之后從hmac得到錯誤結果,則可以發布有關該特定場景的問題,並提供一些示例比較python2 / 3。

您可能會遇到消息本身的問題,該消息需要顯式使用字節而不是字符串。 這兩個值相同:

Python 3:

In [10]: hmac.new(binascii.unhexlify(b"665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569"),
    ...:   msg="whatever".encode('utf-8'),
    ...:   digestmod=hashlib.sha256).hexdigest()
Out[10]: '79ca98357629c22a094c67a02638076573ec41d2c5ce8996435656f8488552d0'

Python 2:

>>> hmac.new("665c20b3c4517e025311160b7fec3fdb9b4d091f142d308c568d0eec4745f569".decode("hex"),
...                                      msg="whatever",
...                                      digestmod=hashlib.sha256).hexdigest()
'79ca98357629c22a094c67a02638076573ec41d2c5ce8996435656f8488552d0'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM