数字签名
数字签名使用私钥生成签名、公钥验证签名,用来验证消息完整性和签名者控制相应私钥;它不是“私钥加密”,也不能单独证明现实世界身份,身份绑定需要证书/PKI 等额外信任机制。
[!info] related notes
数字签名
一句话定义
Digital Signature Scheme 提供:
private key → sign(message) → signature
public key → verify(message, signature) → valid / invalid
它主要帮助验证:
- 数据未被未授权修改;
- 签名由对应 private key 的控制者生成。
签名不是“私钥加密”
这是最重要的纠偏。
旧教材常用:
private key encrypt hash
public key decrypt signature
解释 RSA signature。
这会把 encryption 和 signature 混成一件事。
更正确的模型是:
signature algorithm = key generation + signing algorithm + verification algorithm
例如:
- RSA-PSS;
- ECDSA;
- EdDSA。
它们不是普通 encryption API 的反向调用。
Hash 的角色
许多 signature scheme 会先对消息做 hash / encoding,再进入签名算法的核心步骤。
概念上可理解为:
message → digest / encoded representation → signature operation
但真实 scheme 的 encoding 规则属于算法本身。
不要自行定义:
SHA256(message) → raw private-key math
来替代标准 signature scheme。
Integrity 与 Authenticity
签名验证成功说明:
message + signature + public key
满足该 signature scheme 的验证关系。
它提供:
- integrity;
- proof of control of the corresponding private key。
但 public key 本身属于谁,需要额外信任机制。
因此签名和 PKI / certificate 经常配合使用。
Non-repudiation 的边界
数字签名常被描述成“不可抵赖”。
更严格地说:
- 签名可以形成强技术证据;
- 但法律意义上的不可抵赖还依赖 key custody、身份认证、审计、时间戳、政策和程序。
所以不能把 cryptographic signature 自动等同于法律事实。
当前算法状态
NIST FIPS 186-5 当前规定的签名技术包括:
- RSA;
- ECDSA;
- EdDSA。
旧 DSA 不再用于生成新签名,只保留验证已有签名的用途。
RSA Signature
现代 RSA 签名应使用标准方案,例如 RSA-PSS,而不是 textbook RSA 或“私钥加密 hash”。
ECDSA
ECDSA 基于 elliptic-curve discrete logarithm 结构。
它对 per-signature nonce 非常敏感。
nonce 重复、可预测或泄漏可能直接暴露 private key。
EdDSA
EdDSA 使用 Edwards-curve 系列设计,并采用与 ECDSA 不同的签名构造。
Ed25519 是常见实例。
不要把 Ed25519 简化成“另一条 ECDSA 曲线”。
Signature ≠ Encryption
| 目标 | Encryption | Signature |
|---|---|---|
| confidentiality | 是 | 否 |
| integrity/authenticity | 不是主要目标 | 是 |
| public key role | encrypt / scheme dependent | verify |
| private key role | decrypt / scheme dependent | sign |
一个 signed message 仍然可以是完全公开的。
Certificate Signature
X.509 certificate 本身也使用 digital signature:
CA private key → sign certificate contents
client → verify using issuer public key
这建立的是证书链中的 trust relation。
详见 PKI。
常见失败模式
签名后还能修改未覆盖字段
如果 protocol 没有把所有安全关键字段纳入 signed representation,攻击者可能修改未签名部分。
验证了签名但没验证身份
public key 可能就是攻击者自己的。
自定义签名格式
自行组合 hash + raw RSA/ECC math,容易产生严重漏洞。
私钥存储不安全
签名算法本身安全,也无法挽救已泄漏 private key。
学习检查
- 为什么“私钥加密 = 签名”是错误模型?
- signature scheme 与 hash function 是什么关系?
- 签名验证成功能证明什么,不能证明什么?
- 为什么 public key 真实性仍需要 PKI 或其他 trust mechanism?
- ECDSA nonce 为什么属于高风险安全边界?
- RSA-PSS 与 RSA-OAEP 分别解决什么问题?
- 为什么数字签名的技术不可伪造性不自动等于法律上的不可抵赖?