首页/网络/协议速查/数字签名原理与验签

数字签名原理与验签

签名 = 私钥对摘要运算;验签 = 公钥验证。保证「完整性 + 身份认证 + 不可否认」,TLS 证书与代码签名都基于它。

协议速查网络更新于 2026-10-13

签名与验签在做什么

数字签名先对消息做摘要,再用私钥对摘要运算;验证方用公钥做逆运算并比对摘要。它同时提供三项保证:完整性(内容被改过就验不过)、身份认证(只有私钥持有者能签)、不可否认(签名可作证据)。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 字段),否则攻击者可改成无签名模式直接绕过校验。

易错点

  • 验证签名前不确认公钥归属:拿一把自签的公钥去验自签的消息毫无意义,信任锚必须来自可靠渠道或内置根证书
  • 沿用 SHA-1 或 MD5 做签名摘要:已被证明可构造碰撞,新系统应使用 SHA-256 及以上
  • 只验签名不校验有效期与用途:证书可能已过期或用途不符(如只用于加密却被拿来验签)
  • 验签失败只看「签名错误」四个字:要区分是内容被改、公钥不对还是编码归一化差异(如换行符被转换)

数据来源与参考

  • RFC 8017(RSA 签名)
  • FIPS 186-5(数字签名标准)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌