TypechoJoeTheme

Eternal的博客

什么是“密码验证”、“JWT 签名”和“私钥加密”

eternal博 主小黑
2026-07-28
/
0 评论
/
16 阅读
/
1016 个字
/
百度已收录
07/28
本文最后更新于 2026年07月28日,已超过 3天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

第一层:身份认证(用户密码)
攻击面: 数据库泄露、离线暴力破解、彩虹表

当用户注册并输入密码 P@ssw0rd 时:

服务器绝对不存储该密码,也不用 JWT_SECRET_KEY 去加密它。

安全开发规范要求使用 Argon2id 或 bcrypt 算法。这些算法带有盐(Salt,随机数)和工作因子(Cost Factor,计算耗时)。

存储值=Argon2(password+Salt,Cost)

网安核心: 这是一个单向陷门函数(One-way Trapdoor Function),没有数学上的逆运算。验证登陆时,服务器将用户传来的密码重新带上盐做哈希,比对存储值。
这个过程中,没有任何“解密”操作,也不需要 JWT_SECRET_KEY 参与。 即使你是服务器管理员,也无法逆向出用户的明文密码(除非跑字典攻击)。
第二层:会话凭证(JWT)——对称密钥签名(HMAC)
攻击面: 密钥泄露、算法混淆攻击(CVE)、重放攻击

用户登陆验证通过后,服务器要发给客户端一张“临时身份证”(JWT)。
JWT_SECRET_KEY(强制≥32字符)用于这一层
在 Crypto 库底层,它执行的是 HMAC-SHA256(哈希消息认证码):

Signature=HMAC-SHA256(Header+"."+Payload, JWT_SECRET_KEY)

服务器将 Header、Payload(包含 user_id 和过期时间 exp)和这个 Signature 拼成 Token 发给前端。

注意

  1. 这绝不是加密(Encryption): JWT 的 Payload 仅仅是 Base64Url 编码,不是加密!任何用户只要把 Token 复制到 jwt.io,鼠标滚轮滚一下就能明文看到里面的 user_id。如果你把用户的手机号、权限写进 Payload 而不加额外加密,这属于信息泄露漏洞。
  2. 服务端“验证”的底层逻辑: 当用户带着 Token 回来,服务器不是去“解密”它,而是用同一个 JWT_SECRET_KEY 重新计算一遍 HMAC。如果重新算出来的签名和 Token 里携带的签名不一致,说明 Payload 被人篡改过(比如把 user_id 从 1 改成了 2),服务器直接丢弃该请求。

第三层:用户私钥(非对称加密)————绝不离开客户端
攻击面: 中间人攻击(MITM)、浏览器端 XSS 窃取
在经典的 Web 架构中,通常指 TLS/SSL 客户端证书、SSH 私钥,或者用于端到端加密(E2EE)的密钥。

  • 信任边界: 这笔私钥的生成、存储和运算必须在客户端(浏览器/本地)完成。
  • 责任分离: 服务器只保存对应的公钥(Public Key)。
  • 如果客户端想要证明“我是我”,它会用私钥对一段随机挑战值(Challenge)做签名,服务器拿着公钥验签。
  • JWT_SECRET_KEY 和这个私钥毫无关系。 如果服务器敢让用户把私钥传上来,或者用 JWT_SECRET_KEY 去加密传输私钥,那这套系统的安全模型就彻底崩塌了(因为私钥经过网络传输,等同于把保险柜密码交给了快递员)。

为什么代码强制要求JWT_SECRET_KEY“≥32字符”?
因为 JWT_SECRET_KEY 是 HMAC 的对称密钥。既然是对称的,密钥熵值(Entropy)就是整个会话层的命脉。

256-bit 密钥空间(32字节): 因为 HMAC-SHA256 理论上提供 256 位的安全性。如果你的密钥只有 12 个字符(约 80 位熵),攻击者可以通过离线暴力破解(Offline Brute-force)推算密钥。

攻击推演: 一旦攻击者通过某种侧信道(如备份文件泄露、Git 提交记录)拿到了这个 JWT_SECRET_KEY,他不需要知道任何用户的密码,直接就可以用该密钥伪造任意用户的 JWT Token(包括 user_id=admin),实现水平越权 + 垂直越权,接管整个平台。

这就是为什么 Pydantic 在 APP_ENV=prod 时强行拦截启动——没有足够的熵,宁愿直接 Crash(快速失败),也不允许系统在存在致命逻辑漏洞的情况下运行。

总结一句话:
JWT_SECRET_KEY 是服务器会话层的共享盐根,用来做数据完整性校验(防篡改)和来源认证(防伪造);用户密码是身份验证的单向哈希密文;用户私钥是客户端专属的非对称因子。三者混合使用,构成了认证(AuthN)与授权(AuthZ)的闭环。现在放心去配好那个 64 位 Hex 密钥吧,它正在守护你的会话安全边界!如果有其他关于 JWT 攻击手法的疑问,欢迎继续深挖。

朗读
赞(0)
版权属于:

Eternal的博客

本文链接:

https://eternal3.top/archives/106/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. Typecho打酱油
    2026-04-28
登录
X
用户名
密码