应用层数据加密传输

本文最后更新于:2025年7月25日 早上

一、对称加密

1.特点

使用同一密钥进行加密和解密

优点: 每次加密与解密只需要一个密钥操作管理,简单效率高(这里的简单效率高是相对而言,较复杂的对称加密如果没有硬件支撑依旧会比较吃力)

缺点: 如果只用对称加密,服务端生成的密钥如何安全传递给客户端是一个较为困难的问题。同时一旦有一方密钥外泄,双方的加密解密都会失效。

对称加密流程

2.常见算法

2.1 AES加密

加密过程:

  1. 字节代换(SubBytes)

  2. 行移位(ShiftRows)

  3. 列混淆(MixColumns)

  4. 轮密钥加(AddRoundKey)

上述四步重复执行,重复次数取决于密钥长度,密钥长度支持128,192,256位

2.2 ChaCha20

原理: 一个128位的密钥和一个64位的初始向量生成一个256位的密钥流,通过该密钥流对数据进行按位XOR运算加密解密

Hacker News中一个对比二者的帖子 有人指出二者各自的特点:

ChaCha算法

本质上比 AES 更简单

实现起来更容易

作为一种 ARX 架构(加法 + 旋转 + 异或),不需要使用 S-box,因此不会留下缓存痕迹(有助于防止侧信道攻击)

密钥设置几乎没有额外开销(“free key setup”——密钥初始化几乎无需额外代价)

AES算法

全球通用的加密标准

在大多数平台都有硬件加速支持(这一点非常关键)

一种传统的分组加密算法,拥有许多标准化的加密模式(尤其是大块模式、AEAD 模式等)

算法有很多,阅读一些博客发现每篇博客提到推荐的对称加密算法都是铁打的AES与流水的其他算法,而ChaCha20是询问许多大语言模型除了AES第二个推荐的,Hacker News和reddit都有帖子表明这个算法更轻量且不逊色于AES

二、非对称加密

1.特点

公钥(Public Key)和私钥(Private Key),先使用一个公钥(public key)将明文数据进行加密,然后再使用一个私钥(private key)将加密后的密文进行解密

优点: 更加安全,负责解密的私钥可以不通过网络传输,消除了网络拦截密钥导致密文被破译的风险

缺点: 慢,比对称加密慢数百到数千倍

非对称加密流程

由于其效率更低,非对称加密大多用来加密签名,对称加密的密钥等简短信息。

2.算法

2.1 RSA(很流行)

基于素数运算生成公钥-密钥对

  1. 选择两个大素数 p 和 q。

  2. 计算 n=p×q。

  3. 计算 ϕ(n)=(p−1)(q−1)。

  4. 选择一个整数 e,使得 1<e<ϕ(n) 且 e 与 ϕ(n) 互质。

  5. 计算 d,它是 e 模 ϕ(n) 的模乘法逆元。

  6. 公钥为 (e,n),私钥为 (d,n)。

2.2 ECC(椭圆曲线密码学)

基于椭圆曲线生成公钥-密钥对,比RSA开销少。

该密码学下的Elliptic Curve Diffie-Hellman (ECDH)算法可以用于对称加密的密钥传播,简单流程是双方通过共享约定信息生成一个公钥-密钥对,然后将各自的公钥传递给对方,将获取的公钥与自己的私钥运算获得最终私钥。

知乎上提到的较详细流程:

image-20250723152727994

由于开销大速度慢,非对称加密一般不作为数据传输加密,而是作为证书,签名,时间戳等,或配合对称加密组成混合加密保证密钥传输的安全

三、哈希加密(key derivation function ,KDF)

1.特点

不可逆,多用于密码存储加密,签名,数据完整性认证

2.算法

Argon2

Bcrypt

scrypt

这类加密的算法呼声相较前两者统一了许多,基本都是推荐这三种算法。

四、实现

主要查找收录了对称与非对称加密

通过AES+RSA加密

该文章提出后端为 SpringBoot 时的前后端实现AES+RSA加密,下图为逻辑流程

开源Spring Boot 后端AES加密

一个演示项目实现后端API的AES加密

image-20250723163008691

使用CryptoJS对Vue前端加密

样例代码加密算法是HmacSHA1,这是一个哈希加密,第一个实现中也提到了 CryptoJS ,它应该有更多加密算法实现,可以参考这篇文件学习依赖设置以及基础使用。

开源的springboot加密解密依赖

ChaCha20-Poly1305的java实现样例