浅谈常见的加密方式

444 阅读7分钟

对称加密

对称加密是一种加密和解密使用相同密钥的密码学技术,其核心特点是 “加密密钥 = 解密密钥”,是一种可逆的加密方式。系统的保密性主要由密钥的安全性决定,一般情况下与算法是否保密无关。

对称加解密的基本步骤为:

  1. 加密:将原始数据使用密钥和加密算法生成密文
  2. 解密:将密文使用同一个密钥和加密算法解析出原始数据

对称加密要求密钥必须严格保密,且通信双方需预先共享密钥。常见的对称加密算法有:DES3DESAES-256ChaCha20。这几种算法的具体性能如下:

算法密钥长度块大小安全性性能特点应用场景
DES56 位(实际)64 位已淘汰软件实现约 1MB/s,硬件可加速遗留系统(如旧金融系统)
3DES168 位(3×56)64 位逐步淘汰比 DES 慢 3 倍,约 0.3MB/s银行 POS 机等过渡场景
AES128/192/256 位128 位安全软件约 100MB/s,硬件可到 GB/s主流加密(HTTPS/TLS)
ChaCha20128/256 位64 字节安全纯软件性能优于 AES,适合无硬件加速场景移动端加密(如 WireGuard)

DES 由于密钥长度只有 56 位,论穷举空间为 2^56,目前已可以被破解,因此不建议使用。3DES 在安全性方面也存在“中间相遇攻击”风险,且性能很差,因此也不建议使用。目前建议使用的加密算法为 AES-256,理论速度更快且安全性更强。

对于对称加密,在一些情况下,例如分组加密可能因填充变长,会使得密文长度大于明文。

非对称加密

非对称加密是一种加密和解密使用不同密钥的密码学技术,其最大特点是通过公钥和私钥这种 “密钥对” 实现加密与解密的分离。

非对称加密的基本步骤:

  1. 生成公钥和私钥,公钥是公开共享,用于加密数据或验证签名;私钥(Private Key) 需要严格保密,用于解密数据或生成签名。
  2. 对于加密数据和生成数字签名有两种加解密方式,分别为:
    • 发送方用接收方的公钥加密数据,接收方用自己的私钥解密。
    • 发送方用私钥对消息签名,接收方用公钥验证签名,确保消息未被篡改且来源可信。

非对称加密常被用于数字签名与身份验证、密钥交换与分发、加密数据传输等场景。常见的非对称加密算法有:RSAECCDH。这几种算法的性能如下:

算法数学基础典型密钥长度安全性(当前)主要应用场景
RSA大数分解2048/4096 位HTTPS、数字签名、电子邮件加密等
ECC(P-256)椭圆曲线离散对数256 位区块链、移动设备加密、TLS 1.3等
Diffie-Hellman(DH)有限域离散对数2048 位(与 RSA 同)依赖密钥交换安全性HTTPS 密钥协商、VPN 连接等

与其他加密算法不同的是,DH 算法客户端和服务器的共享密钥是通过公开参数各自计算得出的。

相较于对称加密算法,非对称加密算法的性能都很差,因此适合小规模数据的传输,例如“非对称加密传密钥,对称加密传数据”。因此对于这两种加密方式,需要结合实际的场景使用。

数字签名

数字签名是一种验证数据完整性和身份真实性的密码学技术,主要用途是防止数据在传输过程中被篡改。使用数字签名的常见流程是:

  1. 使用Hash函数对原始数据生成Hash值
  2. 使用私钥对生成的Hash值进行加密(加密可以根据具体场景选择对称或非对称加密)
  3. 将原始数据和加密后的Hash值一起发送给接收方

注:加密是防破解,签名是防篡改

下面以 JWT 的实现为例介绍一下数字签名的具体实现:

JWT

JWT(Json Web Token) 是一个开放的行业标准,用于在通信双方传递json对象。传递的信息经过数字签名可以被验证和信任,数字签名可以通过哈希函数(HMAC算法)以及非对称加密(RSA的公钥/私钥)来签名,防止被篡改。

JWT 的基本样式

JWT 主要有三部分构成,中间使用点(.)隔开,例如 xxxxx.yyyyy.zzzzz:

  1. 第一部分为 Header,header 包括类型以及使用的加密算法,例如:
{
     "alg": "HS256", // 加密算法
     "typ": "JWT"
 }

alg 代表使用的加密算法,HS256就是HMAC-SHA256,加密算法使用HMAC,摘要算法(哈希)使用SHA256。

  1. 第二部分为Payload,Payload 可以存放 JWT 提供的标准字段,比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。 此部分不建议存放敏感信息,因为此部分数据并不会加密。数据具体样式如下:
{
     "sub": "1234567890",
     "name": "456",
     "admin": true
 }
  1. 第三部分为Signature:Signature 也就是签名,此部分用于防止 JWT 的内容被篡改。先将前两个部分用Base64编码,将编码后的字符串使用点(.)连接起来,最后使用header中声明签名算法进行签名,例如:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)

secret 指的是签名所使用的密钥

最终生成的 token 样式为

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3NTE0MjM2NDYsIm5iZiI6MTc1MTQyMzY0NiwiZXhwIjoxNzUxNTEwMDQ2LCJzdHVfaWQiOjIzMDA1NjcsImNvdW5zZWxvcl9pZCI6MTMwMDQ3MH0.jFNkQCnONgi2Rip1gODxoSoy6F34O5IbWUZuN83PIJw

每部分都用点(.)隔开,第一、二部分即为 Header 和 Payload 使用 Base64 编码后的值,第三部分为签名经过 Base64 编码后的值。

JWT 的验签流程

  1. 按照点(.)分隔 JWT,根据 Base64 解码,解析出 Header 和 Payload
  2. 获取 Header 中的类型和签名算法
  3. 使用相同的算法和密钥对 Header 和 Payload 生成签名
  4. 将新生成的签名与 JWT 中的 Signature 对比,如果签名一致,表示验签通过,可以继续执行其余逻辑。如果签名不一致,表示验签没有通过,直接返回失败。

JWT 的优点

  1. 基于 Json 协议,解析起来非常方便
  2. 可以在 Payload 中添加自定义的内容,扩展起来很方便
  3. 在一定程度上能够确保数据不被篡改

JWT 的缺点

  1. JWT包含用户信息,体积较大
  2. 一旦签发,在过期前无法撤销
  3. 客户端存储Token存在安全风险
  4. 每次请求都需要验证签名

哈希函数

Hash 函数是一种将任意长度输入转换为固定长度哈希值的算法,Hash函数理论是不可逆的,即Hash值无法转换为原始值。广泛用于数据完整性校验、密码存储、数据索引等场景,在加密中常见的Hash函数有:MD5、SHA1、SHA256

这三种算法的具体性能如下:

算法MD5SHA1SHA256
输出长度128 位(16 字节)160 位(20 字节)256 位(32 字节)
首次提出1991 年1995 年2001 年
安全现状已被彻底破解已被实际碰撞攻击尚未被攻破(理论安全)
典型性能约 100MB/s(CPU)约 50MB/s(CPU)约 30MB/s(CPU)

由于 SHA1 和 SHA256 的计算逻辑相比 MD5 更加复杂,因此性能上相对更差一些,但安全性更高。
哈希函数虽然可以通过加盐的方式防止彩虹表攻击,但为了保证数据的安全,目前还是建议使用是 SHA256 算法。