AES 在线加密:在浏览器中保护你的数据
了解 AES 加密的工作原理,探索 CBC 和 GCM 模式,在浏览器中加密文本或文件——数据不会离开你的设备。
为什么需要浏览器端加密?
加密将可读数据转换为只有持有正确密钥的人才能解密的密文。AES(高级加密标准)是最广泛使用的对称加密算法——被政府、银行和科技公司采用。
浏览器端加密有一个关键优势:数据永远不会离开你的设备。无需信任服务器,不会泄露数据,也不需要账户。我们的 AES 加密工具 使用 Web Crypto API 在客户端执行所有操作。
AES 的工作原理
AES 使用 128、192 或 256 位密钥对 128 位的数据块进行操作。算法通过多轮替换、置换和混合处理数据:
- AES-128:10 轮——对大多数应用足够
- AES-192:12 轮——实际中很少使用
- AES-256:14 轮——最高安全性,机密级数据的标准
明文 → [AES 加密 + 密钥] → 密文
密文 → [AES 解密 + 密钥] → 明文
操作模式
CBC(密码块链接)
每个块在加密前与前一个密文块进行异或操作。需要初始化向量(IV)。如果实现不当容易受到填充预言攻击。
// 使用 Web Crypto API 的 AES-CBC 加密
async function encryptAES(plaintext, password) {
const enc = new TextEncoder();
const keyMaterial = await crypto.subtle.importKey(
'raw', enc.encode(password), 'PBKDF2', false, ['deriveKey']
);
const salt = crypto.getRandomValues(new Uint8Array(16));
const iv = crypto.getRandomValues(new Uint8Array(16));
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' },
keyMaterial, { name: 'AES-CBC', length: 256 }, false, ['encrypt']
);
const ciphertext = await crypto.subtle.encrypt(
{ name: 'AES-CBC', iv }, key, enc.encode(plaintext)
);
return { ciphertext, iv, salt };
}
GCM(Galois/计数器模式)
GCM 在单一操作中同时提供加密和认证。它是现代应用的推荐模式——比 CBC 更快且防篡改。
// AES-GCM 加密(推荐)
async function encryptGCM(plaintext, password) {
const enc = new TextEncoder();
const salt = crypto.getRandomValues(new Uint8Array(16));
const iv = crypto.getRandomValues(new Uint8Array(12)); // GCM 用 12 字节
const keyMaterial = await crypto.subtle.importKey(
'raw', enc.encode(password), 'PBKDF2', false, ['deriveKey']
);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' },
keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt']
);
const ciphertext = await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv }, key, enc.encode(plaintext)
);
return { ciphertext, iv, salt };
}
密钥派生:从密码到密钥
AES 需要固定长度的密钥,但人类的密码长度不一且熵低。密钥派生函数(KDF)通过将密码扩展为强密钥来解决这个问题:
- PBKDF2:标准方案——重复应用哈希函数(10 万次以上迭代)。
- Argon2:内存密集型,抗 GPU 攻击——现代首选。
- scrypt:PBKDF2 的内存密集型替代方案。
# Python: 从密码派生密钥
from hashlib import pbkdf2_hmac
import os
password = b"my-secret-password"
salt = os.urandom(16)
key = pbkdf2_hmac('sha256', password, salt, iterations=100000, dklen=32)
print(f"派生密钥: {key.hex()}")
在浏览器中加密文件
利用 File API 和 Web Crypto,可以在纯客户端加密文件:
- 用户通过
<input type="file">选择文件 - 文件内容作为 ArrayBuffer 读取
- AES-GCM 用密码派生的密钥加密缓冲区
- 加密后的 blob 提供下载
我们的 加密工具 为文本和文件输入处理这个流程,生成只能用正确密码解密的加密输出。
常见加密错误
- 重复使用 IV:绝对不要在同一密钥下重复使用 IV——在 GCM 模式下会完全破坏安全性。
- 弱密码:AES-256 配 4 位密码等于零安全性。
- 不使用认证:使用认证模式(GCM)或添加 HMAC。没有认证的加密容易被篡改。
- 自己造轮子:使用成熟的库和 API。自定义实现几乎总有 bug。
AES vs 其他算法
- ChaCha20-Poly1305:AES-GCM 的现代替代品,在没有 AES 硬件加速的设备上更快。
- RSA:非对称(加密和解密使用不同密钥)。用 RSA 交换 AES 密钥,然后用 AES 处理实际数据。
- 3DES:遗留算法,已弃用——使用 AES 替代。
常见问题
AES-256 比 AES-128 更安全吗?
技术上是的,但 AES-128 已经在计算上不可行被暴力破解。AES-256 提供了对理论量子攻击的额外防线。对大多数场景,两者都安全。
能否加密文本并与他人分享?
可以。用共享密码加密消息,发送密文,对方用相同密码解密。只是要通过不同的渠道分享密码(不要和密文走同一渠道)。
浏览器加密真的安全吗?
使用 Web Crypto API 时是安全的。它利用操作系统的加密库,提供与服务端实现相同的算法。优势在于:数据从不离开你的设备。
忘记密码会怎样?
无法恢复。AES 加密被设计为没有密钥就无法破解。将密码存储在密码管理器中,避免丢失加密数据的访问权限。
总结
AES 加密保护你的数据免受未授权访问——无论它存储在磁盘上、通过网络传输,还是与协作者共享。我们的 AES 加密工具 以简单界面将军事级加密带到你的浏览器:输入文本、设置密码、加密。数据不会离开你的设备。
试试这个工具?
打开工具 →