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