🗣 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地址: 165.169.97.233
搜索次数: 7
提问时间: 2025-12-29 03:39:59
本站所有
❓
问答
均由Ai自动分析整理,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
本站由
🟢
豌豆Ai
提供技术支持,使用的最新版:
豌豆Ai站群搜索引擎系统 V.25.10.25
搭建本站。