[英]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.