分享|常见加密技术
加密是为了保护数据的安全,进行数据校验,或者进行认证。从用途上看,常见手段分成三类:对称加密、非对称加密,以及不可逆的摘要(Digest)算法。前几天在团队分享加密相关的知识,也是现学现卖,看了本书和在网上查了些资料就开始讲了,废话不多说了,进入本篇文章的主题。
加密相关的基础知识
- 对称加密
- 通信双方持有同一把密钥,解密通常是加密的逆运算。经典算法早期是 DES,现在主流是 AES
- 用户一多,每对通信方都要单独协商密钥,密钥数量会膨胀
- 密钥本身如果走明文网络传输是不安全的(尤其是第一次交换)
- 双方都持有相同密钥,密钥不能标识「只有某一方能签」,因此不能单独用来做身份认证
- 特点:运算快,适合加密大量业务数据
- 非对称加密
- 也叫公钥密码:一对密钥里,公钥公开,私钥自己保管。既可以加密,也可以做认证
- 加密:公钥加密,私钥解密(只有私钥持有者能读)
- 认证 / 签名:私钥签名,公钥验签(能确认签名来自私钥持有者)
- 经典实现是 RSA(基于大整数分解困难),另外还有基于离散对数的 DSA,以及基于椭圆曲线的 ECDSA / ECDH
- 典型应用:TLS/SSL 握手、SSH、数字证书
- 特点:比对称加密慢一到两个数量级,不适合直接加密大文件;因为公私钥分离,适合在网上交换密钥、做身份认证
- 也叫公钥密码:一对密钥里,公钥公开,私钥自己保管。既可以加密,也可以做认证
- 单向散列 / 信息摘要 / 信息指纹
- 摘要(Message Digest)把任意长度数据压成固定长度的比特串,例如 MD5 是 128 bit(32 位十六进制),SHA-256 是 256 bit
- 特点:输出长度固定;计算不可逆;相同输入一定得到相同输出。常用来做完整性校验、密码存储(要加盐)、文件指纹
- HMAC 不是「再哈希一次」,而是带密钥的摘要:没有密钥就算不出正确的 HMAC,所以能同时校验完整性和来源
三者经常一起用,而不是互斥:HTTPS 里用非对称算法交换/协商会话密钥,用对称算法加密后续流量,用摘要和 HMAC(或 AEAD)保证数据没被改过。
常见算法
对称加密
- DES / 3DES:DES 密钥只有 56 bit,早已不安全。3DES 把 DES 套三次,速度慢,也逐渐被淘汰
- AES:当前对称加密的事实标准,密钥长度 128 / 192 / 256 bit。实际使用还要选工作模式(GCM、CBC 等),优先选带认证的 GCM,避免只加密不校验
- 还有 ChaCha20 等流密码,在移动端和部分 TLS 套件里常见
非对称加密
- RSA:加密、签名都能做。密钥至少 2048 bit。现在新系统更常见的是椭圆曲线(ECC),同等安全强度下密钥更短
- ECDH:用来做密钥协商,双方算出同一份共享密钥,再交给 AES 去加密数据
- 数字证书:把「某把公钥属于某个域名/机构」这件事,交给 CA 用它的私钥签下来。浏览器验签通过,才相信这次 TLS 握手里的公钥
单向散列
- MD5、SHA-1:碰撞攻击已经实用,不要再用于安全场景(校验下载包完整性也逐渐在换)
- SHA-256 / SHA-3:目前常用的摘要
- HMAC-SHA256:接口签名、Webhook 验签、Session 防篡改都很常见
- 存用户密码不要直接 MD5。至少用带盐的慢哈希,例如 bcrypt、scrypt、Argon2
实际里怎么组合
一个典型的「既要快又要能在网上传密钥」的流程:
- 用证书确认对方公钥是真的(防中间人)
- 用 RSA 或 ECDH 协商出一把临时的对称密钥
- 后续报文用 AES-GCM 加密并校验
- 需要证明「是我说的」时,再对摘要做一次私钥签名
记住这张对照就够日常判断:
| 目标 | 用什么 |
|---|---|
| 加密大量数据 | 对称加密(AES) |
| 网上交换密钥、证明身份 | 非对称加密(RSA / ECC) |
| 校验有没有被改过 | 摘要 / HMAC |
| 证明是某个人说的 | 私钥签名 + 公钥验签 |
EOF