数字签名

一、什么是数字签名?
数字签名是用于验证数字消息或文档真实性和完整性的一种密码学机制,它是电子形式的“签名”,确保:
- 消息确实来自声称的发送者(身份认证)
- 消息在传输过程中未被篡改(完整性)
- 发送者事后不能否认自己签过名(不可否认性)
二、数字签名的基本原理
数字签名通常结合非对称加密算法与哈希算法来实现:
签名过程(Sender)
- 对消息
M
进行哈希处理,得到摘要H(M)
。 - 用发送者的私钥对摘要进行加密,得到签名
S = Sign(H(M), PrivateKey)
。 - 将签名 S 与原文 M 一起发送给接收方。
验签过程(Receiver)
对收到的原文
M
进行相同的哈希,得到H1 = H(M)
。用发送者的公钥解密签名
S
,得到H2 = Verify(S, PublicKey)
。比较
H1
与H2
:- 如果相等:签名有效,消息未被篡改,且确实由发送者签名。
- 如果不等:签名无效,可能伪造或被篡改。
三、常见数字签名算法
类别 | 代表算法 | 特点与说明 |
---|---|---|
基于RSA | RSA签名 | 最早的签名算法,安全性依赖于大整数因式分解困难 |
基于DSA | DSA | 美国标准,速度比RSA快,但只用于签名 |
基于椭圆曲线 | ECDSA | 椭圆曲线DSA,更高效,密钥更短,适合嵌入式与区块链等场景 |
国密标准 | SM2签名 | 国家标准,基于ECC,广泛用于国内电子政务、企业系统 |
后量子签名 | Dilithium等 | 面对量子计算的威胁,仍在研究与推广阶段 |
四、数字签名 vs 加密 vs 哈希
比较维度 | 数字签名 | 加密 | 哈希 |
---|---|---|---|
目标 | 身份认证、完整性验证、不可否认 | 数据保密 | 数据完整性校验 |
是否可逆 | 是(验证签名) | 是(有解密) | 否(单向) |
是否涉及密钥 | 是(非对称密钥) | 是(对称或非对称) | 否(部分哈希有HMAC变种) |
加密对象 | 哈希摘要 | 原始数据 | 原始数据 |
五、数字签名的典型应用场景
场景 | 描述 |
---|---|
HTTPS/SSL证书 | 浏览器验证服务器SSL证书是否合法,用CA的数字签名确认身份 |
区块链 | 比特币、以太坊用ECDSA或类似算法对交易进行签名,验证拥有者 |
电子邮件 | 使用PGP/GPG签名邮件,防止邮件伪造和篡改 |
软件发布验证 | 发布方对软件包签名,用户验证安装文件是否来自可信方 |
电子合同签署 | 用户或企业使用SM2/ECDSA对电子合同签署,具备法律效力 |
代码签名 | 微软/苹果等要求开发者对应用进行数字签名,防止恶意软件 |
六、优缺点分析
优点 | 缺点 |
---|---|
✔ 保证身份可信(防伪) | ✘ 依赖非对称加密,算法复杂,性能开销大 |
✔ 验证数据完整性(防篡改) | ✘ 需要可靠的公钥分发机制(如PKI) |
✔ 提供不可否认性(事后追责) | ✘ 私钥泄漏后可能被伪造签名 |
✔ 可用于签名+加密组合场景 | ✘ 法律效力需结合法规和第三方认证机构(如CA认证) |
七、简单实例说明
假设你用 ECDSA 签名一句话“你好,世界”:
- 将“你好,世界”进行哈希(如SHA256) → 得到摘要。
- 用你的私钥签名这个摘要 → 得到签名(一个大数字)。
- 发送原文 + 签名。
- 接收方用你的公钥验证签名是否与消息匹配。
八、扩展阅读建议
- PKI(公钥基础设施):数字签名广泛依赖它来分发可信的公钥证书。
- SM2、SM3、SM9:国家密码局的国密签名与认证算法,常用于国产软件。
- 量子安全签名:面对量子计算威胁的新型签名方案(如Lattice-based)。