对称加密
对称加密是一种加密和解密使用相同密钥的密码学技术,其核心特点是 “加密密钥 = 解密密钥”,是一种可逆的加密方式。系统的保密性主要由密钥的安全性决定,一般情况下与算法是否保密无关。
对称加解密的基本步骤为:
- 加密:将原始数据使用密钥和加密算法生成密文
- 解密:将密文使用同一个密钥和加密算法解析出原始数据
对称加密要求密钥必须严格保密,且通信双方需预先共享密钥。常见的对称加密算法有:DES、3DES、AES-256、ChaCha20。这几种算法的具体性能如下:
| 算法 | 密钥长度 | 块大小 | 安全性 | 性能特点 | 应用场景 |
|---|---|---|---|---|---|
| DES | 56 位(实际) | 64 位 | 已淘汰 | 软件实现约 1MB/s,硬件可加速 | 遗留系统(如旧金融系统) |
| 3DES | 168 位(3×56) | 64 位 | 逐步淘汰 | 比 DES 慢 3 倍,约 0.3MB/s | 银行 POS 机等过渡场景 |
| AES | 128/192/256 位 | 128 位 | 安全 | 软件约 100MB/s,硬件可到 GB/s | 主流加密(HTTPS/TLS) |
| ChaCha20 | 128/256 位 | 64 字节 | 安全 | 纯软件性能优于 AES,适合无硬件加速场景 | 移动端加密(如 WireGuard) |
DES 由于密钥长度只有 56 位,论穷举空间为 2^56,目前已可以被破解,因此不建议使用。3DES 在安全性方面也存在“中间相遇攻击”风险,且性能很差,因此也不建议使用。目前建议使用的加密算法为 AES-256,理论速度更快且安全性更强。
对于对称加密,在一些情况下,例如分组加密可能因填充变长,会使得密文长度大于明文。
非对称加密
非对称加密是一种加密和解密使用不同密钥的密码学技术,其最大特点是通过公钥和私钥这种 “密钥对” 实现加密与解密的分离。
非对称加密的基本步骤:
- 生成公钥和私钥,公钥是公开共享,用于加密数据或验证签名;私钥(Private Key) 需要严格保密,用于解密数据或生成签名。
- 对于加密数据和生成数字签名有两种加解密方式,分别为:
- 发送方用接收方的公钥加密数据,接收方用自己的私钥解密。
- 发送方用私钥对消息签名,接收方用公钥验证签名,确保消息未被篡改且来源可信。
非对称加密常被用于数字签名与身份验证、密钥交换与分发、加密数据传输等场景。常见的非对称加密算法有:RSA、ECC、DH。这几种算法的性能如下:
| 算法 | 数学基础 | 典型密钥长度 | 安全性(当前) | 主要应用场景 |
|---|---|---|---|---|
| RSA | 大数分解 | 2048/4096 位 | 高 | HTTPS、数字签名、电子邮件加密等 |
| ECC(P-256) | 椭圆曲线离散对数 | 256 位 | 高 | 区块链、移动设备加密、TLS 1.3等 |
| Diffie-Hellman(DH) | 有限域离散对数 | 2048 位(与 RSA 同) | 依赖密钥交换安全性 | HTTPS 密钥协商、VPN 连接等 |
与其他加密算法不同的是,DH 算法客户端和服务器的共享密钥是通过公开参数各自计算得出的。
相较于对称加密算法,非对称加密算法的性能都很差,因此适合小规模数据的传输,例如“非对称加密传密钥,对称加密传数据”。因此对于这两种加密方式,需要结合实际的场景使用。
数字签名
数字签名是一种验证数据完整性和身份真实性的密码学技术,主要用途是防止数据在传输过程中被篡改。使用数字签名的常见流程是:
- 使用Hash函数对原始数据生成Hash值
- 使用私钥对生成的Hash值进行加密(加密可以根据具体场景选择对称或非对称加密)
- 将原始数据和加密后的Hash值一起发送给接收方
注:加密是防破解,签名是防篡改
下面以 JWT 的实现为例介绍一下数字签名的具体实现:
JWT
JWT(Json Web Token) 是一个开放的行业标准,用于在通信双方传递json对象。传递的信息经过数字签名可以被验证和信任,数字签名可以通过哈希函数(HMAC算法)以及非对称加密(RSA的公钥/私钥)来签名,防止被篡改。
JWT 的基本样式:
JWT 主要有三部分构成,中间使用点(.)隔开,例如 xxxxx.yyyyy.zzzzz:
- 第一部分为 Header,header 包括类型以及使用的加密算法,例如:
{
"alg": "HS256", // 加密算法
"typ": "JWT"
}
alg 代表使用的加密算法,HS256就是HMAC-SHA256,加密算法使用HMAC,摘要算法(哈希)使用SHA256。
- 第二部分为Payload,Payload 可以存放 JWT 提供的标准字段,比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。 此部分不建议存放敏感信息,因为此部分数据并不会加密。数据具体样式如下:
{
"sub": "1234567890",
"name": "456",
"admin": true
}
- 第三部分为Signature:Signature 也就是签名,此部分用于防止 JWT 的内容被篡改。先将前两个部分用Base64编码,将编码后的字符串使用点(.)连接起来,最后使用header中声明签名算法进行签名,例如:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
secret 指的是签名所使用的密钥
最终生成的 token 样式为:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3NTE0MjM2NDYsIm5iZiI6MTc1MTQyMzY0NiwiZXhwIjoxNzUxNTEwMDQ2LCJzdHVfaWQiOjIzMDA1NjcsImNvdW5zZWxvcl9pZCI6MTMwMDQ3MH0.jFNkQCnONgi2Rip1gODxoSoy6F34O5IbWUZuN83PIJw
每部分都用点(.)隔开,第一、二部分即为 Header 和 Payload 使用 Base64 编码后的值,第三部分为签名经过 Base64 编码后的值。
JWT 的验签流程:
- 按照点(.)分隔 JWT,根据 Base64 解码,解析出 Header 和 Payload
- 获取 Header 中的类型和签名算法
- 使用相同的算法和密钥对 Header 和 Payload 生成签名
- 将新生成的签名与 JWT 中的 Signature 对比,如果签名一致,表示验签通过,可以继续执行其余逻辑。如果签名不一致,表示验签没有通过,直接返回失败。
JWT 的优点:
- 基于 Json 协议,解析起来非常方便
- 可以在 Payload 中添加自定义的内容,扩展起来很方便
- 在一定程度上能够确保数据不被篡改
JWT 的缺点:
- JWT包含用户信息,体积较大
- 一旦签发,在过期前无法撤销
- 客户端存储Token存在安全风险
- 每次请求都需要验证签名
哈希函数
Hash 函数是一种将任意长度输入转换为固定长度哈希值的算法,Hash函数理论是不可逆的,即Hash值无法转换为原始值。广泛用于数据完整性校验、密码存储、数据索引等场景,在加密中常见的Hash函数有:MD5、SHA1、SHA256
这三种算法的具体性能如下:
| 算法 | MD5 | SHA1 | SHA256 |
|---|---|---|---|
| 输出长度 | 128 位(16 字节) | 160 位(20 字节) | 256 位(32 字节) |
| 首次提出 | 1991 年 | 1995 年 | 2001 年 |
| 安全现状 | 已被彻底破解 | 已被实际碰撞攻击 | 尚未被攻破(理论安全) |
| 典型性能 | 约 100MB/s(CPU) | 约 50MB/s(CPU) | 约 30MB/s(CPU) |
由于 SHA1 和 SHA256 的计算逻辑相比 MD5 更加复杂,因此性能上相对更差一些,但安全性更高。
哈希函数虽然可以通过加盐的方式防止彩虹表攻击,但为了保证数据的安全,目前还是建议使用是 SHA256 算法。