签名与验签在做什么
数字签名先对消息做摘要,再用私钥对摘要运算;验证方用公钥做逆运算并比对摘要。它同时提供三项保证:完整性(内容被改过就验不过)、身份认证(只有私钥持有者能签)、不可否认(签名可作证据)。TLS 证书、代码签名、软件升级包校验、JWT 签名都建立在这个机制上。
基本信息
| 流程 | 摘要、私钥签名、对方用公钥验签 |
|---|---|
| 常用算法 | RSA-PSS、ECDSA、Ed25519 |
| 为什么先摘要 | 控制运算量,并避免对超长消息直接做模幂运算 |
| 不提供什么 | 不提供保密性:任何人都能读取消息,只是无法篡改 |
| 信任前提 | 验签方必须确认公钥确实属于声称者 |
相关场景
| 场景 | 签名对象 | 验证方式 |
|---|---|---|
| TLS 证书 | 证书内容(由 CA 签) | 浏览器内置根证书链验证 |
| 代码签名 | 安装包或可执行文件 | 操作系统校验证书与时间戳 |
| 软件升级包 | 升级文件 | 内置公钥校验签名后才允许升级 |
| JWT | 头部与载荷 | 服务端用密钥或公钥验签 |
签名与验签演示
签名与验签演示
openssl dgst -sha256 -sign private.pem -out sig.bin message.txt # 用私钥签名
openssl dgst -sha256 -verify public.pem -signature sig.bin message.txt # 用公钥验签
# 证书本身也是被签发者签名的
openssl verify -CAfile ca.crt -untrusted chain.pem server.crt
# 篡改检测:改动一个字节后再次验签应当失败
printf 'x' >> message.txt && openssl dgst -sha256 -verify public.pem -signature sig.bin message.txt典型使用场景
- 离线升级包的完整性校验:设备本地验签通过才允许安装
- 接口调用方身份认证:请求体加签,服务端验签并校验时间戳防重放
- 排查证书链验证失败:确认信任根、中间证书与主机名三者都正确
- 审计签名算法:把 MD5 或 SHA-1 签名的旧证书与旧固件列出来做整改
签名不提供保密性:消息以明文发送,任何中间人都能看到内容,只是改不了。要保密必须再叠加加密,二者解决的是不同问题。
验签服务要固定允许的算法白名单:不能接受调用方自选算法(如 JWT 头里的 alg 字段),否则攻击者可改成无签名模式直接绕过校验。