密码学基础知识
1. 密码学到底在解决什么问题
密码学不是单纯“把内容变乱”,它主要解决 4 类问题:
- 机密性:不让别人看懂内容。
- 完整性:发现内容有没有被改。
- 身份认证:确认对方是谁。
- 不可否认性:事后不能否认自己做过某次签名或发布。
不同技术解决的问题不同,这也是面试里最容易混淆的地方。比如:
- 加密主要解决机密性。
- 哈希摘要主要解决完整性基础。
- 数字签名主要解决身份认证 + 完整性 + 不可否认性。
2. 常见基础概念
2.1 明文、密文、密钥
- 明文:原始数据。
- 密文:加密后的数据。
- 密钥:控制加密和解密过程的核心秘密参数。
如果算法公开、但没有密钥就无法恢复明文,这才是现代密码学的基本设计思路。也就是说,真正需要保密的是密钥,不是算法本身。
2.2 编码、加密、摘要不是一回事
这三个概念经常被混着说,但差别很大:
| 概念 | 是否可逆 | 主要目的 | 常见例子 |
|---|---|---|---|
| 编码 | 可逆 | 便于传输或表示 | Base64、URL 编码 |
| 加密 | 可逆 | 防止未授权查看 | AES、RSA |
| 摘要 | 不可逆 | 生成固定长度指纹 | SHA-256 |
结论很简单:
Base64不是加密。- 哈希摘要不是加密。
- 签名也不是加密。
3. 对称加密
3.1 什么是对称加密
对称加密指的是:加密和解密使用同一把密钥。
常见算法包括:
AESChaCha20- 早期的
DES、3DES(现在通常不建议新系统使用)
3.2 优点和缺点
优点:
- 速度快。
- 适合加密大量数据。
- CPU 和带宽开销相对低。
缺点:
- 密钥分发困难。
- 通信双方必须先安全地共享同一把密钥。
3.3 常见使用场景
对称加密通常用于:
HTTPS中真正加密 HTTP 数据。- 数据库透明加密。
- 文件加密。
- 磁盘加密。
- 消息体加密。
一句话概括:对称加密负责“高效传大数据”。
4. 非对称加密
4.1 什么是公钥和私钥
非对称加密会生成一对密钥:
- 公钥(Public Key):可以公开给别人。
- 私钥(Private Key):只能自己保管。
这两个密钥在数学上相关,但不能从公钥轻易反推出私钥。
4.2 非对称加密能做什么
非对称密码体系主要有两类能力:
- 公钥加密,私钥解密
- 私钥签名,公钥验签
这两种用途经常共用“公钥/私钥”这组概念,但目的完全不同。
4.3 常见算法
常见非对称算法包括:
RSAECC/ECDSAEd25519SM2(国内场景常见)
4.4 优点和缺点
优点:
- 解决了密钥分发的一部分难题。
- 能支持数字签名。
缺点:
- 计算成本高。
- 不适合直接加密大体积业务数据。
所以工程上通常不会“全程只用非对称加密”,而是和对称加密配合使用。
5. 公钥私钥到底怎么理解
5.1 加密场景
如果你要给服务端发一段只有它能看到的数据,可以:
- 用服务端公钥加密。
- 服务端用自己的私钥解密。
这样别人即使拿到密文,没有私钥也解不开。
5.2 签名场景
如果服务端要证明“这条消息确实是我发的,而且没被改过”,可以:
- 用自己的私钥签名。
- 别人用服务端公钥验签。
所以:
- 公钥加密 / 私钥解密 关注的是保密。
- 私钥签名 / 公钥验签 关注的是证明身份和防篡改。
5.3 为什么公钥可以公开
因为公钥的设计目标本来就是给别人使用:
- 别人需要它来加密发给你的消息。
- 别人需要它来验证你的签名。
真正敏感的是私钥。私钥一旦泄露,加密和签名体系都会出问题。
6. 数字签名与验签
6.1 数字签名在解决什么问题
数字签名主要解决:
- 这份内容是不是某个私钥持有者发的。
- 内容中途有没有被改。
- 签名者事后能不能轻易否认。
6.2 签名和验签的基本过程
典型过程不是“直接对整段原文做私钥运算”,而是:
- 先对原文计算摘要。
- 再用私钥对摘要做签名。
- 接收方收到原文和签名后,用公钥验签。
- 接收方再对原文重新计算摘要并比对。
如果一致,说明:
- 内容没被改。
- 签名大概率来自对应私钥持有者。
6.3 签名和加密的区别
| 维度 | 加密 | 签名 |
|---|---|---|
| 主要目标 | 保密 | 身份认证、防篡改 |
| 谁来操作 | 通常用接收方公钥加密 | 发送方私钥签名 |
| 谁来恢复/验证 | 接收方私钥解密 | 接收方用发送方公钥验签 |
一句话记忆:
- 加密是“怕别人看”。
- 签名是“怕别人改,怕别人冒充”。
7. 哈希摘要
7.1 什么是哈希摘要
哈希摘要是把任意长度输入,映射成固定长度输出的过程。它的目标不是“保密”,而是生成数据指纹。
常见算法:
SHA-256SHA-3- 早期的
MD5、SHA-1(安全敏感场景不再推荐)
7.2 摘要有什么特点
- 输出固定长度。
- 原文稍微变化,摘要就会明显变化。
- 不能高效地从摘要反推原文。
- 会有碰撞,但好的算法会让碰撞极难构造。
7.3 摘要常用在哪里
- 文件完整性校验。
- 数字签名输入。
- 证书签名输入。
- 内容指纹。
- 区块链、Merkle Tree 等结构。
8. MAC 和 HMAC
8.1 为什么光有摘要还不够
如果只是把内容和摘要一起发出去,攻击者完全可以:
- 改内容。
- 重新计算一个新摘要。
- 把两者一起替换。
所以光靠普通摘要,不能证明“这份摘要是可信发送方生成的”。
8.2 HMAC 是什么
HMAC(Hash-based Message Authentication Code)可以理解成:
- 带密钥的摘要校验。
它把共享密钥和消息一起参与计算,因此只有知道密钥的双方才能生成正确结果。
8.3 HMAC 解决什么问题
HMAC 主要解决:
- 消息完整性。
- 对称场景下的身份认证。
常见场景:
- API 请求签名。
- JWT 的
HS256。 - 服务间共享密钥的请求校验。
9. 密钥交换
9.1 为什么需要密钥交换
对称加密很快,但前提是双方已经有同一把密钥。问题在于:
- 这把密钥怎么安全地传给对方?
密钥交换就是用来解决这个问题的。
9.2 Diffie-Hellman 的核心思想
Diffie-Hellman(以及更常见的 ECDHE)的核心是:
- 双方各自保留私密参数不外传。
- 交换公开参数。
- 最终各自在本地算出同一份共享秘密。
这样共享密钥就不需要明文传输。
9.3 现代 HTTPS 中怎么用
现代 TLS 很常使用 ECDHE:
- 证书负责认证服务端身份。
ECDHE负责协商本次连接的临时会话密钥。- 会话密钥再交给对称加密算法去保护业务数据。
10. 证书和 CA
10.1 证书是什么
证书本质上是:
- 某个公钥属于某个主体的一份带签名证明。
主体可以是:
- 域名。
- 组织。
- 个人。
- 设备。
10.2 CA 在做什么
CA(Certificate Authority,证书颁发机构)的职责是:
- 审核身份。
- 签发证书。
- 用自己的私钥给证书签名。
客户端之所以相信站点证书,是因为它能一路验证到本地信任的根 CA。
10.3 证书常用在哪里
HTTPS- mTLS
- VPN
- 代码签名
- 邮件签名
- 电子签章
11. 密码学在工程里通常怎么组合使用
11.1 HTTPS
HTTPS 不是只靠一种算法,而是多种能力组合:
- 证书:证明服务端身份。
- 非对称密码学:支撑签名验证和部分握手过程。
- 密钥交换:协商会话密钥。
- 对称加密:真正加密 HTTP 数据。
- 摘要 / AEAD:保证完整性。
11.2 JWT
JWT 常见有两类:
HS256:基于共享密钥的 HMAC。RS256/ES256:基于公私钥的签名。
它们主要解决的是:
- Token 是否被篡改。
- Token 是否由可信签发方生成。
JWT 默认不是加密令牌,而是签名令牌。
11.3 API 请求签名
开放平台常见做法是:
- 请求参数按规则拼接。
- 加入时间戳、nonce。
- 用 HMAC 或私钥签名。
这样可以防止:
- 参数篡改。
- 请求伪造。
- 一部分重放攻击。
12. 常见误区
12.1 “加密就能防篡改”
不完全对。单纯加密主要保证机密性,完整性通常还要结合:
- MAC / HMAC
- 数字签名
- AEAD 模式
12.2 “签名就是把内容加密一遍”
不对。签名的重点不是保密,而是证明来源和完整性。
12.3 “有公钥就能解密私钥签名的内容”
这是一种很容易误导的说法。验签不是“把签名解密成原文”,而是通过密码学算法验证:
- 该签名是否由对应私钥生成。
- 原文摘要是否一致。
12.4 “哈希摘要可以拿来存密码”
不能简单这么做。密码存储不能只用快速摘要,如 MD5、SHA-256 直接裸算,而应该用:
bcryptscryptArgon2
因为密码场景的重点是抗暴力破解,而不是只做一般完整性校验。
12.5 “有 HTTPS 就绝对安全”
不对。HTTPS 主要保护传输链路,它不能自动解决:
- XSS
- SQL 注入
- 业务越权
- 弱口令
- 服务端代码漏洞
13. 面试里可以怎么回答
如果面试官问“密码学基础知识有哪些”,可以按这个顺序答:
- 先说密码学主要解决机密性、完整性、身份认证、不可否认性。
- 再区分对称加密和非对称加密:对称快但密钥分发难,非对称慢但能支持签名和更灵活的密钥体系。
- 然后解释公钥私钥两种用途:公钥加密私钥解密,私钥签名公钥验签。
- 再补摘要、HMAC、证书、CA、密钥交换各自解决什么问题。
- 最后结合
HTTPS、JWT、API 签名讲工程落地。
一句收尾可以是:
密码学不是只有“加密”一个动作,而是一套围绕保密、认证、完整性和信任传递的工具箱。工程上通常不是单独使用某个算法,而是把对称加密、非对称加密、签名、摘要、证书和密钥交换组合起来使用。