应用层数据加密传输
本文最后更新于:2025年7月25日 早上
一、对称加密
1.特点
使用同一密钥进行加密和解密
优点: 每次加密与解密只需要一个密钥操作管理,简单效率高(这里的简单效率高是相对而言,较复杂的对称加密如果没有硬件支撑依旧会比较吃力)
缺点: 如果只用对称加密,服务端生成的密钥如何安全传递给客户端是一个较为困难的问题。同时一旦有一方密钥外泄,双方的加密解密都会失效。
2.常见算法
2.1 AES加密
加密过程:
字节代换(SubBytes)
行移位(ShiftRows)
列混淆(MixColumns)
轮密钥加(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(很流行)
基于素数运算生成公钥-密钥对
选择两个大素数 p 和 q。
计算 n=p×q。
计算 ϕ(n)=(p−1)(q−1)。
选择一个整数 e,使得 1<e<ϕ(n) 且 e 与 ϕ(n) 互质。
计算 d,它是 e 模 ϕ(n) 的模乘法逆元。
公钥为 (e,n),私钥为 (d,n)。
2.2 ECC(椭圆曲线密码学)
基于椭圆曲线生成公钥-密钥对,比RSA开销少。
该密码学下的Elliptic Curve Diffie-Hellman (ECDH)算法可以用于对称加密的密钥传播,简单流程是双方通过共享约定信息生成一个公钥-密钥对,然后将各自的公钥传递给对方,将获取的公钥与自己的私钥运算获得最终私钥。
知乎上提到的较详细流程:

由于开销大速度慢,非对称加密一般不作为数据传输加密,而是作为证书,签名,时间戳等,或配合对称加密组成混合加密保证密钥传输的安全。
三、哈希加密(key derivation function ,KDF)
1.特点
不可逆,多用于密码存储加密,签名,数据完整性认证
2.算法
Argon2
Bcrypt
scrypt
这类加密的算法呼声相较前两者统一了许多,基本都是推荐这三种算法。
四、实现
主要查找收录了对称与非对称加密
通过AES+RSA加密
该文章提出后端为 SpringBoot 时的前后端实现AES+RSA加密,下图为逻辑流程

开源Spring Boot 后端AES加密
一个演示项目实现后端API的AES加密

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