Python實現(xiàn)JWT加解密的示例代碼
一、什么是JWT
JWT(JSON Web Tokens)是一種用于在網(wǎng)絡(luò)應(yīng)用環(huán)境間安全地傳輸信息的簡潔的、URL安全的令牌標(biāo)準(zhǔn)。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。
通俗地說,JWT的本質(zhì)就是一個字符串,它是將用戶信息保存到一個Json字符串中,然后進行編碼后得到一個JWT token,并且這個JWT token帶有簽名信息,接收后可以校驗是否被篡改,所以可以用于在各方之間安全地將信息作為Json對象傳輸。官網(wǎng)地址:https://jwt.io/
二、JWT的組成
1. Header
頭部
是一個描述JWT元數(shù)據(jù)的JSON對象,alg屬性表示簽名使用的算法,默認(rèn)為HMAC SHA256(寫為HS256);typ屬性表示令牌的類型,JWT令牌統(tǒng)一寫為JWT。最后,使用Base64 URL算法將上述JSON對象轉(zhuǎn)換為字符串保存,如下:
{ "alg": "HS256", "typ": "JWT" }
2. Payload
負(fù)載
是JWT的主體內(nèi)容部分,也是一個JSON對象,包含需要傳遞的數(shù)據(jù)。 JWT指定七個默認(rèn)字段供選擇,如下:
iss:發(fā)行人 exp:到期時間 sub:主題 aud:用戶 nbf:在此之前不可用 iat:發(fā)布時間 jti:JWT ID用于標(biāo)識該JWT
除以上默認(rèn)字段外,我們還可以自定義私有字段,一般會把包含用戶信息的數(shù)據(jù)放到payload中,如下:
{ "name": "John Doe", "num": 1516239022 }
3. Signature
簽名
的作用是保證JWT的未被篡改。簽名的生成方式是將編碼后的頭部、編碼后的負(fù)載、秘密通過指定的算法進行簽名。簽名的作用是保證JWT的發(fā)送者不能抵賴自己發(fā)送的消息,接收者能夠驗證消息的完整性。這里是將前2部分的密文拼接起來,對這2部分進行HS256加密,然后加鹽,最后在對加密后的內(nèi)容用Base64加密一次。
注意JWT每部分的作用,在服務(wù)端接收到客戶端發(fā)送過來的JWT token之后:
header
和payload
可以直接利用base64解碼出原文,從header
中獲取哈希簽名的算法,從payload
中獲取有效數(shù)據(jù)。signature
由于使用了不可逆的加密算法,無法解碼出原文,它的作用是校驗token有沒有被篡改。服務(wù)端獲取header
中的加密算法之后,利用該算法加上secretKey對header
、payload
進行加密,比對加密后的數(shù)據(jù)和客戶端發(fā)送過來的是否一致。注意secretKey只能保存在服務(wù)端,而且對于不同的加密算法其含義有所不同,一般對于MD5類型的摘要加密算法,secretKey實際上代表的是鹽值。
三、爬蟲中遇到的js代碼
以下是我遇到的網(wǎng)站示例:
四、使用Python實現(xiàn)
import random import time import jwt def get_t(): # 模擬 getConfig() 方法返回的配置 config = {"key": "這是Key"} # 替換為實際的密鑰 key = config["key"] # 轉(zhuǎn)換密鑰為字節(jié) r = key.encode("utf-8") # 隨機字符串 (JTI) o = str(int(int(time.time() * 1000) * random.random() * 10000)) # print(o) # 當(dāng)前時間戳 + 300 秒 (未來 5 分鐘) s = int(time.time() + 300) # print(s) # JWT payload 數(shù)據(jù) payload = { "a": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", # 模擬用戶代理 "exp": s, "jti": o, } # JWT header headers = {"alg": "HS256", "typ": "JWT"} # 生成 JWT token = jwt.encode(payload, r, algorithm="HS256", headers=headers) print(token) # 解密的方法 print(jwt.decode(token, r, algorithms=["HS256"], headers=headers)) # 獲取 JWT 的 payload 部分(Base64 編碼的第二部分) jwt_parts = token.split(".") jwt_payload_last_part = jwt_parts[2] # 獲取簽名部分 # 拼接結(jié)果 final_token = f"{jwt_payload_last_part}.{o}{s}" return final_token # 調(diào)用函數(shù) result = get_t() print(result)
到此這篇關(guān)于Python實現(xiàn)JWT加解密的示例代碼的文章就介紹到這了,更多相關(guān)Python JWT加解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對Python3中bytes和HexStr之間的轉(zhuǎn)換詳解
今天小編就為大家分享一篇對Python3中bytes和HexStr之間的轉(zhuǎn)換詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12對python中的乘法dot和對應(yīng)分量相乘multiply詳解
今天小編就為大家分享一篇對python中的乘法dot和對應(yīng)分量相乘multiply詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11對PyQt5的輸入對話框使用(QInputDialog)詳解
今天小編就為大家分享一篇對PyQt5的輸入對話框使用(QInputDialog)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python+matplotlib繪制不同大小和顏色散點圖實例
這篇文章主要介紹了Python+matplotlib繪制不同大小和顏色散點圖實例,matplotlib的用法是比較多種多樣的,下面一起看看其中的一個實例吧2018-01-01你應(yīng)該知道的Python3.6、3.7、3.8新特性小結(jié)
這篇文章主要介紹了你應(yīng)該知道的Python3.6、3.7、3.8新特性小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05