You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JWT签名应使用公钥还是私钥?为何优先选择私钥?

JWT签名:为啥优先用私钥?公钥签名可行吗?

为啥优先用私钥签JWT?

JWT的安全核心是防篡改+不可抵赖,这完全依赖非对称加密的密钥分工逻辑:

  • 私钥只有签发JWT的主体持有,别人拿不到。接收方用对应的公钥验证签名通过时,能百分百确定这份JWT就是那个主体发的,不会被冒充,也没法抵赖。
  • 公钥是公开的,谁都能拿到,接收方用它就能验证JWT内容有没有被篡改——只要签名对得上,内容就是完整的。

要是反过来用公钥签名,直接就把这套安全逻辑搞崩了:

  • 公钥是公开的,谁都能用它生成签名,接收方根本没法确认JWT到底是谁发的,不可抵赖性直接作废。
  • 验证这种签名得用私钥,但私钥不能随便给别人,接收方拿不到私钥,连验证都做不了,完全失去了JWT的意义。

能不能用公钥签JWT?

技术上能实现,但没有任何实际应用价值,纯粹是自毁安全防线。不过要是你只是想做技术验证,这里给个Python示例(用PyJWT库):

公钥签名的技术演示

假设你已经有RSA密钥对,公钥存在public.pem,私钥存在private.pem:

import jwt
from cryptography.hazmat.primitives import serialization

# 加载公钥
with open("public.pem", "rb") as f:
    public_key = serialization.load_pem_public_key(f.read())

# 用公钥签名JWT(注意:这是反常规操作,别在生产环境用)
payload = {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
token = jwt.encode(payload, public_key, algorithm="RS256")

# 验证时必须用私钥(但私钥不可能公开给验证方)
with open("private.pem", "rb") as f:
    private_key = serialization.load_pem_private_key(f.read(), password=None)

try:
    decoded = jwt.decode(token, private_key, algorithms=["RS256"])
    print(decoded)
except jwt.InvalidSignatureError:
    print("签名验证失败")

这个例子只是证明技术上能跑,但实际场景绝对别这么干——任何人拿到公钥都能伪造JWT,接收方也没法安全验证,完全违背了JWT的设计目的。

内容的提问来源于stack exchange,提问作者youmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:19:58