一、先理解背景:为什么需要“签名算法”
当服务器把一段信息发给客户端时,比如登录后返回一个 JWT(JSON Web Token),里面可能包含:
- 用户ID
- 用户权限
- 过期时间
{
"user_id": 123,
"role": "admin",
"exp": 1710000000
}
客户端可以修改这段内容吗?
如果用户把 “role”: “admin” 改成 “super_admin”,服务器怎么知道?
所以必须有一个机制:确保这段数据没有被篡改。
解决方法就是:给数据加一个“签名”。
签名算法(Signing Algorithm)
- HS256
- RS256
二、JWT 的整体结构
JWT 长这样:header.payload.signature
例如:xxxxx.yyyyy.zzzzz
三部分:
说明算法
{
“alg”: “HS256”,
“typ”: “JWT”
}
用户信息
{
"user_id": 123,
"role": "admin"
}
服务器计算出来的一段加密字符串。
这个签名就是:签名 = 算法(header + payload + 密钥)
HS256 和 RS256 的区别就是:密钥体系不同。
三、HS256:对称加密(一个钥匙)
先想象一个现实场景:你和朋友有一个 秘密密码。
例如:密码:abc123
你写一封信,然后用这个密码生成一个签名。
朋友收到信之后:
也用 同一个密码 重新计算签名。
如果结果一致:说明信没被改。
这就是 HS256 的逻辑
特点:
签名 和 验证
用的是同一个密钥
流程:
1. 服务器生成 token
服务器有一个密钥:
secret = "my-secret-key"
签名计算:
signature = HMACSHA256(
base64(header) + "." + base64(payload),
secret
)
得到:
xxxxx.yyyyy.signature
发给客户端。
2 客户端带 token 请求
客户端请求:
Authorization: Bearer token
3 服务器验证
服务器再次计算:
signature2 = HMACSHA256(data, secret)
如果
signature == signature2
说明数据没有被篡改。
HS256核心特点
只有一个密钥:secret
它既用于:
- 签名
- 验证
这叫:对称加密 / 对称签名
结构:
Server
│
│ secret
▼
Sign + Verify
四、RS256:非对称加密(两把钥匙)
现在换一个现实类比:
银行保险箱。
有两把钥匙:
一把私钥 一把公钥
规则:
私钥:只有银行有 公钥:任何人都可以有
关键特性:
私钥签名 公钥验证
这就是 RS256
五、RS256 的流程
系统有两把钥匙:
private key (私钥) public key (公钥)
关系:
私钥签名 公钥验证
1 服务器生成 token
服务器使用:private key
生成签名:signature = RSA-SHA256(data, privateKey)
得到 token:xxxxx.yyyyy.signature
2 客户端携带 token
请求 API:Authorization: Bearer token
3 服务端验证
验证使用:public key
计算:verify(data, signature, publicKey)
如果成功:说明签名来自 对应私钥。
六、最核心区别
| 密钥数量 | 一个 | 两个 |
| 类型 | 对称 | 非对称 |
| 签名 | secret | private key |
| 验证 | secret | public key |
| 安全模型 | 所有人共享一个密钥 | 私钥永远不外泄 |
项目场景的真实开发
绝大多数都用 RS256
因为它解决了一个 非常关键的问题:密钥分发问题
举个真实场景:
有三个服务:
Auth Server(登录服务)
API Server(业务服务)
Gateway(网关)
如果使用 HS256
所有服务都必须知道:
secret
问题:
只要一个服务泄露 secret:
任何人都能伪造 token
而 RS256:
只有 Auth Server 有:private key
其他服务只有:public key
即使 API Server 被攻破:
攻击者也只能:验证 token
但无法伪造 token。
因为:没有 private key
这就是 非对称签名的巨大优势。


![P11246 [GESP202409 六级] 小杨和整数拆分-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108100631-6af049a75855c-220x150.png)
![打卡信奥刷题(3678)用C++实现信奥题 P12274 [蓝桥杯 2024 国 Python B] 设计-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108053830-6af00ad6bdf8d-220x150.png)
