一、先搞清楚三个基础概念
在进入“数字签名”之前,必须先理解加密和哈希。
1.1 加密(Encryption)
加密是将明文通过某种算法转换成密文的过程,目的是保密。只有拥有正确密钥的人才能解密还原明文。
对称加密:加密和解密使用同一个密钥。
优点:速度快,适合大数据。
缺点:密钥分发困难(如何把密钥安全给对方?)
常见算法:AES、DES、SM4非对称加密:加密和解密使用一对密钥:公钥(Public Key)和私钥(Private Key)。
公钥加密 → 私钥解密(用于保密)
私钥加密 → 公钥解密(用于身份认证,即数字签名的原理)
优点:解决了密钥分发问题。
缺点:速度慢。
常见算法:RSA、ECC、SM2
1.2 哈希(Hash / 散列)
哈希算法将任意长度的数据映射成固定长度的短字符串(哈希值 / 摘要)。
特点:
- 单向性:无法从哈希值反推出原文。
- 抗碰撞:很难找到两个不同输入产生相同哈希值。
- 雪崩效应:原文改一点,哈希值完全改变。
常见算法:MD5(已不安全)、SHA-1(已弱化)、SHA-256、SM3
哈希本身不是加密,它不涉及密钥,也不能还原。哈希的作用是完整性校验和生成数字签名的基础。
二、数字签名:到底是什么?
数字签名(Digital Signature)是对电子数据的一种签名,用于确认:
- 身份认证:消息确实是声称的发送者发出的。
- 完整性:消息在传输过程中没有被篡改。
- 不可否认:发送者无法事后否认自己发过该消息。
2.1 数字签名的核心步骤
以RSA为例,发送者 Alice 要签署消息并发送给 Bob:
1. Alice 对原文 M 计算哈希值 H = hash(M) 2. Alice 用她的私钥(唯一她能拥有的)对 H 进行加密,得到签名 S = Encrypt_private(H) 3. Alice 将 (M, S) 一起发送给 Bob 4. Bob 收到后: - 对 M 计算哈希值 H1 = hash(M) - 用 Alice 的公钥解密签名 S,得到 H2 = Decrypt_public(S) - 比较 H1 与 H2,若相等,则签名有效关键点:
- 私钥用于签名(只有自己能做),公钥用于验证(任何人都能做)。
- 签名是对哈希值加密,而不是对原文加密 —— 目的是缩短签名长度、提高效率。
- 如果哈希值匹配,证明:消息未被修改(完整性),且是拥有私钥的人发出的(认证+不可否认)。
2.2 数字签名 ≠ 加密
很多人混淆:数字签名不是为了保密,而是为了认证和完整。签名的消息本身可以是明文(比如代码签名、合同PDF)。
| 加密 | 数字签名 | |
|---|---|---|
| 目的 | 机密性(不让别人看到) | 认证、完整性、不可否认 |
| 使用的密钥 | 公钥加密,私钥解密 | 私钥签名,公钥验签 |
| 对谁可见 | 只有收方(有私钥)能看到 | 任何人都能验证签名,但未必能看到明文 |
| 典型场景 | 发送机密文件、HTTPS握手 | 软件签名、JWT、电子合同 |
实战中,两者经常结合使用:比如先签名再加密,既保证真实性又保证机密性。
三、公钥与私钥:一对奇妙的搭档
非对称加密的核心是密钥对:
- 公钥(Public Key):可以公开分发,任何人都能拿到。
- 私钥(Private Key):必须严格保密,只能由所有者保管。
3.1 两种经典用法
| 用法 | 操作 | 解决问题 |
|---|---|---|
| 加密通信 | 发送方用接收方的公钥加密 → 接收方用自己的私钥解密 | 防止中间人窃听 |
| 数字签名 | 发送方用自己的私钥签名 → 接收方用发送方的公钥验证 | 确认发送者身份 + 数据未被篡改 |
3.2 一个生活化比喻
- 公钥:像一把打开的锁,谁都可以拿来锁东西。
- 私钥:像唯一的一把钥匙,只有主人能打开。
场景一(加密):你想寄秘密信给我,我先把锁(公钥)寄给你,你用锁把信锁进铁箱,寄给我,我用自己的钥匙(私钥)打开。
场景二(签名):你把一个包裹贴上你的专属印章(用你的私钥签名),我用你的公开印章图案(公钥)验证这个包裹确实是你寄的。
四、经典算法一览(考试常用)
4.1 对称加密算法
| 算法 | 密钥长度 | 特点 |
|---|---|---|
| AES | 128/192/256 bit | 目前最常用,安全高效 |
| DES | 56 bit | 已过时,可被暴力破解 |
| 3DES | 112/168 bit | 比DES安全但较慢,逐步被AES替代 |
| SM4 | 128 bit | 中国国密标准 |
4.2 非对称加密算法
| 算法 | 常见用途 | 特点 |
|---|---|---|
| RSA | 加密、签名 | 最经典,基于大数分解难题。1024/2048/4096位 |
| ECC (椭圆曲线) | 加密、签名 | 相同安全强度下密钥更短、性能更好 |
| SM2 | 加密、签名 | 国密非对称算法 |
| DSA | 仅数字签名 | 不支持加密,只用于签名验证 |
| ECDSA | 签名 | 基于椭圆曲线的DSA变体 |
4.3 哈希算法(考试注意MD5/SHA-1已被攻破)
| 算法 | 输出长度 | 安全状态 |
|---|---|---|
| MD5 | 128 bit | 不安全,可碰撞 |
| SHA-1 | 160 bit | 已弱化,建议弃用 |
| SHA-256 | 256 bit | 安全,广泛使用 |
| SM3 | 256 bit | 国密哈希 |
五、实际应用场景(考试案例题常见)
5.1 HTTPS/TLS 如何综合运用?
- 服务器拥有公钥+私钥,并持有数字证书(CA签名)。
- 浏览器访问服务器,服务器返回证书(含公钥)。
- 浏览器验证证书(用CA公钥验证签名),确认服务器身份。
- 浏览器生成一个临时会话密钥(对称密钥),用服务器公钥加密后发送。
- 服务器用私钥解密得到会话密钥。
- 后续通信使用对称加密(AES),因为更快。
这一过程同时用到了:非对称加密(传递对称密钥+身份认证)、对称加密(数据加密)、数字签名(证书验证)。
5.2 软件数字签名
开发者对软件包计算哈希,再用私钥对哈希签名。用户下载软件和签名,用开发者公钥验证签名 —— 确保软件未被植入病毒且来自官方。
5.3 JWT (JSON Web Token) 的签名
JWT 可使用HS256(对称签名)或RS256(非对称签名)。RS256 中,认证服务器用私钥签发 Token,资源服务器用公钥验证 Token 合法性,无需共享密钥。
六、考试常见选择题与辨析
题目1:关于数字签名,说法正确的是?
A. 数字签名使用公钥进行签名,私钥进行验证
B. 数字签名可以保证消息的机密性
C. 数字签名通常先对消息计算哈希,再对哈希加密
D. 数字签名只能用RSA算法实现
答案:C。
A错:签名用私钥,验签用公钥。B错:签名不提供机密性,提供完整性和认证。D错:还有DSA、ECDSA等。
题目2:在非对称加密中,若希望保证只有接收方能够读取消息,应使用?
A. 发送方私钥加密
B. 发送方公钥加密
C. 接收方私钥加密
D. 接收方公钥加密
答案:D。保证机密性时,用接收方公钥加密。
题目3:关于哈希函数,错误的是?
A. 哈希函数是单向的
B. 不同输入可能产生相同哈希值(碰撞)
C. 可以通过哈希值反推原文
D. 哈希函数常用于数字签名
答案:C。哈希不可逆。
七、一张图总结:加密与数字签名全过程(文字描述)
发送方(Alice) 接收方(Bob) | | | 明文 M | | -- 1. 计算哈希 H = hash(M) | | -- 2. 用私钥加密H得到签名 S | | -- 3. (可选) 用Bob公钥加密(M+S)得到密文C | | ------ 发送 C (或直接 M+S) -----> | | | | 4. 若密文,先用自己私钥解密得到M+S | 5. 用Alice公钥解密S得到H2 | 6. 计算H1 = hash(M) | 7. 如果H1==H2,验证成功图中第3步为“加密+签名”同时使用,保证机密性+认证性。
八、易错点+高频考点总结
| 易混淆点 | 正确理解 |
|---|---|
| “公钥加密,私钥解密” → 加密 | ✅ 正确,用于机密性 |
| “私钥加密,公钥解密” → 加密 ❌ | 这不是加密,是签名(不保证机密性) |
| 数字签名 = 对原文加密 | ❌ 是对哈希值加密 |
| 哈希算法是加密算法的一种 | ❌ 哈希不是加密,无密钥 |
| 越长密钥一定越安全 | ❌ 还要看算法(ECC 256位 ≈ RSA 3072位) |
| 公钥必须保密 | ❌ 公钥就是公开的 |
九、备考建议
牢记两个“钥匙用途”口诀
- 加密:公锁私开(别人用我公钥锁,我用私钥开)
- 签名:私签公验(我私钥签名,大家公钥验)
理解HTTPS握手过程(案例题常考TLS四次握手如何混合使用对称+非对称+数字证书)
记住国密算法:SM2(非对称)、SM3(哈希)、SM4(对称) —— 近年考试有涉及国产化趋势。