🗣 Wd提问: JWT源码开发
🤖 Ai回答: JSON Web Token (JWT) 是一种轻量级的开放标准(RFC 7519),用于在网络应用环境中安全地传输信息。JWT 的核心是通过加密算法生成一个紧凑且自包含的字符串,可以安全地在客户端和服务器之间传递。下面将从 原理、编码流程、源码实现 逐步讲解 JWT 的开发过程,并提供一个简单的代码示例。
一、JWT 的基本结构
JWT 由三部分组成,用 `.` 分隔:
1、Header(头部):声明加密算法(如 `HS256` 或 `RS256`)和 Token 类型(通常为 `JWT`)。
2、Payload(负载):包含声明(claims),分为:
注册声明(Registered Claims):如 `iss`(签发者)、`exp`(过期时间)、`sub`(主题)等。
公共声明(Public Claims):可公开的自定义声明。
私有声明(Private Claims):双方约定的私有声明。
3、Signature(签名):通过 `Header + Payload` 和密钥生成的签名,用于验证数据完整性和身份。
二、JWT 的编码流程
1、编码步骤
1、生成 Header:
json
{
alg: HS256, // 加密算法(如 HMAC-SHA256)
typ: JWT // 类型声明
}
2、生成 Payload:
json
{
sub: 1234567890,
name: John Doe,
iat: 1516239022, // 签发时间(Unix 时间戳)
exp: 1516242622 // 过期时间(iat + 有效期)
}
3、Base64Url 编码:
将 Header 和 Payload 转为 JSON 字符串,再进行 Base64Url 编码。
4、生成 Signature:
plaintext
HMACSHA256(
base64UrlEncode(header) + '.' + base64UrlEncode(payload),
secret_key
)
5、拼接三部分:
plaintext
<base64UrlHeader.<base64UrlPayload.<signature
2、解码与验证
1、拆分三部分:用 `.` 分割 Token。
2、验证签名:
用相同的算法和密钥重新计算签名,对比是否与原签名一致。
3、验证声明:
检查 `exp`(是否过期)、`nbf`(生效时间)、`iat`(签发时间)等。
三、JWT 源码实现(以 Python 为例)
以下是一个简单的 JWT 编码和验证实现,使用 `HS256` 算法和 `base64` 库:
python
import base64
import hashlib
import hmac
import json
from time import time
def base64url_encode(data: bytes) str:
return base64.urlsafe_b64encode(data).rstrip(b'=').decode('utf-8')
def base64url_decode(data: str) bytes:
padding = len(data) % 4
if padding:
data += '=' * (4 padding)
return base64.urlsafe_b64decode(data)
def generate_jwt(header: dict, payload: dict, secret: str) str:
Step 1: Encode Header and Payload
header_json = json.dumps(header).encode('utf-8')
payload_json = json.dumps(payload).encode('utf-8')
encoded_header = base64url_encode(header_json)
encoded_payload = base64url_encode(payload_json)
Step 2: Generate Signature
signing_input = f{encoded_header}.{encoded_payload}.encode('utf-8')
signature = hmac.new(
secret.encode('utf-8'),
signing_input,
hashlib.sha256
).digest()
encoded_signature = base64url_encode(signature)
Step 3: Combine
return f{encoded_header}.{encoded_payload}.{encoded_signature}
def verify_jwt(token: str, secret: str) dict | None:
parts = token.split('.')
if len(parts) != 3:
return None
encoded_header, encoded_payload, encoded_signature = parts
Rebuild signing input
signing_input = f{encoded_header}.{encoded_payload}.encode('utf-8')
Recompute signature
expected_signature = hmac.new(
secret.encode('utf-8'),
signing_input,
hashlib.sha256
).digest()
expected_sig_str = base64url_encode(expected_signature)
Compare signatures (constant-time comparison to prevent timing attacks)
if hmac.compare_digest(expected_sig_str, encoded_signature):
Decode payload and validate claims
try:
payload = json.loads(base64url_decode(encoded_payload))
if 'exp' in payload:
current_time = time()
if payload['exp'] < current_time:
return None Expired
return payload
except:
return None
return None
示例用法
if __name__ == __main__:
header = {alg: HS256, typ: JWT}
payload = {
sub: 1234567890,
name: John Doe,
iat: int(time()),
exp: int(time()) + 3600 有效期 1 小时
}
secret = your-256-bit-secret
token = generate_jwt(header, payload, secret)
print(Generated Token:, token)
验证 Token
verified_payload = verify_jwt(token, secret)
if verified_payload:
print(Payload:, verified_payload)
else:
print(Invalid Token)
四、关键注意事项
1、安全性:
密钥(`secret`)必须保密,避免硬编码。
使用强加密算法(如 `RS256` 需要 RSA 密钥对)。
禁止在 JWT 中存储敏感信息(如密码)。
2、声明管理:
`exp` 必须严格验证,防止过期 Token 被重用。
可以添加 `nbf`(生效时间)、`aud`(接收方)等声明。
3、编码细节:
Base64Url 编码需要去除结尾的 `=` 并替换字符(如 `+` → `-`, `/` → `_`)。
签名比较应使用 `hmac.compare_digest` 防止时序攻击。
五、扩展与优化
1、支持多种算法:实现 `RS256` 需要 RSA 密钥对生成和签名。
2、声明校验增强:添加 `aud`(接收方)、`jti`(JWT ID 防重放)等验证。
3、库的使用:实际项目中建议使用成熟的库(如 Python 的 `PyJWT`),但理解底层原理有助于排查问题。
通过以上步骤,你可以实现一个基础的 JWT 库。实际开发中,建议结合现有库并遵循最佳实践以确保安全性。
📣 商家广告:





0
IP地址: 221.12.161.7
搜索次数: 0
提问时间: 2025-10-30 11:57:29
🛒 域名购买:
xq.gs
qun.cx
yb.gs
xc6.net
afuncard.com
46.gold
73.gold
yk.gs
cisou.com.cn
zqll.cn
❓️ 热门提问:
常见的域名注册平台有哪些
云服务器国内
域名怎样买
可以免费申请域名的网站
xampp虚拟主机
r910服务器
创梦idc
德宏网站建设公司
,美国vps
VPS服务器迁移案例
豌豆Ai站群搜索引擎系统
🌐 域名评估:
rmpf.cn
qklpay.com
mmmf.com.cn
ax.cq.cn
trfi.cn
byd.hk.cn
starfair.org.cn
635.net.cn
mypettoy.com
cxw.cc
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
广州香港月饼厂
搜尋引擎大全
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。