2026-10-25 17:14:35
使用 Redis 存储已登录用户并生成唯一令牌时,需兼顾唯一性、安全性和不可预测性。以下是具体实现方案及注意事项:
1. 令牌生成策略避免直接使用用户ID用户ID易被枚举攻击(如递增ID暴露用户量)。应通过不可逆哈希或随机数组合生成令牌。
推荐方法:HMAC-SHA256 哈希
将用户ID、时间戳、随机盐值(如 uuid.uuid4())拼接后,用服务端私钥(密钥需保密)进行 HMAC-SHA256 哈希。
示例代码(Python):import hmac, hashlib, os, timedef generate_token(user_id, secret_key): salt = os.urandom(16).hex() # 随机盐值 raw = f"{user_id}{salt}{int(time.time())}" token = hmac.new(secret_key.encode(), raw.encode(), hashlib.sha256).hexdigest() return token
优势:即使攻击者获取令牌,也无法反推用户ID或盐值。
更高安全性选项
使用 SHA-512 或 RSA-SHA256(非对称签名,但性能开销较大)。
结合 JWT(需设置短有效期,避免长期暴露)。
键值结构
Key: token:{hashed_token}(哈希后的令牌,防止Redis数据泄露时直接暴露原始令牌)。
Value: 用户ID + 过期时间(如JSON字符串 {"user_id": 123, "exp": 1735689600})。
示例:SET token:a1b2c3d4 '{"user_id": 123, "exp": 1735689600}' EX 3600
过期时间
必须设置TTL(如1小时),配合前端刷新机制(如Refresh Token)。
避免使用永久令牌,减少泄露风险。
令牌绑定客户端信息在生成令牌时加入客户端IP或User-Agent哈希,防止令牌被跨设备滥用(需权衡灵活性)。
令牌黑名单用户登出时,将令牌加入Redis黑名单(如 logout_tokens:{token}),验证时检查黑名单。
HTTPS 传输强制所有通信使用HTTPS,防止中间人攻击窃取令牌。
密钥轮换定期更换HMAC密钥,旧密钥生成的令牌仍可验证,但新令牌使用新密钥。
哈希令牌后查询Redis(GET token:{hashed_token})。
检查是否存在及是否过期。
验证通过后返回用户数据。
通过以上方法,可在保证性能的同时显著提升安全性。