跳转到内容
HexaTransfer
返回博客
加密与安全

AES-256加密指南:军事级文件保护

了解AES-256加密及其作为文件保护黄金标准的原因。学习这种军事级加密如何保护您的传输安全。

AES-256 是美国 NSA 依据 CNSSP-15 批准用于绝密数据的对称分组密码。它通过 14 轮替换、置换和混合运算,对 128 位数据块使用 256 位密钥进行加密。暴力破解一个 AES-256 密钥平均需要约 2^255 次运算——地球上所有计算机运行宇宙年龄的时间也无法破解。这正是从 SwissTransfer 到 Tresorit,每一家严肃的文件传输服务都以 AES-256 作为批量加密算法的原因。下面详细解释它的工作原理。

"256"代表什么

AES 有三种密钥长度:128 位、192 位和 256 位。这个数字只表示密钥长度,而不是数据块大小(块大小始终为 128 位)。密钥大小决定了密码运行的轮数:AES-128 运行 10 轮,AES-192 运行 12 轮,AES-256 运行 14 轮。

轮数越多,扩散性越强——每个输出位依赖于更多输入位,抵抗双关键字攻击等密码分析手段的能力也更强。2011 年发表的双密钥攻击理论上将 AES-256 的有效安全性从 256 位降低到 254.4 位,但这仍远超任何实际攻击的能力范围。

联邦信息处理标准 FIPS 197 定义了 AES,NIST SP 800-38A 至 800-38G 定义了各种操作模式。

操作模式:GCM 与 CBC 与 ECB

AES 是分组密码,只知道如何加密一个 128 位的块。要加密任意大小的文件,需要一种操作模式。选择至关重要:

  • ECB(电子密码本):相同的明文块产生相同的密文。绝不要使用。著名的"ECB 企鹅"图片展示了 Tux 的轮廓在 ECB 加密像素中清晰可见。
  • CBC(密码块链接):每个块与前一个密文进行 XOR。配合 HMAC 认证时是安全的,但单独的 CBC 容易受到 padding oracle 攻击(2014 年的 POODLE 攻击就针对 SSL 的 CBC 模式)。
  • GCM(伽罗华/计数器模式):用计数器加密,同时在一次运算中生成 128 位认证标签。篡改密文会导致解密失败并明确报错。这是现代服务使用的模式。

AES-256-GCM 是 TLS 1.3、Signal、WireGuard 以及所有可信文件传输服务的默认选择。如果服务只说"AES-256"而不指定模式,通常可以假定是 GCM,但最好主动核实。

绝不能复用的 IV(随机数)

GCM 要求在使用同一密钥加密时,每次必须使用唯一的 96 位初始化向量(IV)。哪怕用同一密钥复用一次 IV,攻击者就能对两段密文执行 XOR 来恢复明文——这是对 WEP Wi-Fi 进行灾难性利用的著名漏洞。

最佳实践:使用密码学安全的随机数生成器生成 IV(浏览器中用 crypto.getRandomValues(),Linux 上用 /dev/urandom),并将其附在密文前面。96 位随机 IV 在加密 2^32 个文件后碰撞概率约为 2^-48,对文件传输服务来说完全可以接受。如果同一密钥用于数十亿个文件,则应改用确定性计数器。

密钥派生:将密码转换为密钥

用户喜欢用"mydog2024"这样的密码,而 AES 需要 256 位均匀随机数。密钥派生函数(KDF)充当两者之间的桥梁。当前有三种常用的 KDF:

  • PBKDF2,配合 HMAC-SHA-256 和 60 万次迭代(OWASP 2023 年推荐)。广泛支持,可通过 Web Crypto API 调用。
  • scrypt,增加了内存硬度,提高了 GPU 攻击成本。Bitcoin 和 LastPass 使用此方案。
  • Argon2id,是当前最佳实践,2015 年密码哈希竞赛的冠军。推荐参数:memory=64 MB, iterations=3, parallelism=4

通过 Argon2id 处理一个 12 位随机密码,现代 GPU 需要约十亿年才能暴力破解。但无论使用哪种 KDF,像"password123"这样的弱密码都会在毫秒内被攻破。

在浏览器中使用 AES:Web Crypto API

浏览器通过 window.crypto.subtle 原生暴露了 AES-256-GCM。典型的调用流程如下:

const key = await crypto.subtle.generateKey(
  { name: "AES-GCM", length: 256 },
  true,
  ["encrypt", "decrypt"]
);
const iv = crypto.getRandomValues(new Uint8Array(12));
const ciphertext = await crypto.subtle.encrypt(
  { name: "AES-GCM", iv },
  key,
  fileBytes
);

现代 CPU 具备 AES-NI 指令集,将吞吐量提升到每核心约 3–5 GB/s。1 GB 文件在中端笔记本上不到一秒即可完成加密。在移动端,Apple A 系列和高通骁龙芯片内置了 ARMv8 加密扩展,性能相当。

AES-256 能保护什么,保护不了什么

AES-256 解决一个特定问题:在密钥保密的前提下,保护静态或传输中数据的机密性。它解决不了以下问题:

  • 密钥管理。如果把密码和文件一起发送,AES-256 形同虚设。
  • 终端被攻陷。在加密前读取明文的恶意软件完全绕过了密码算法。
  • 实现漏洞。2018 年的 BEAST、CRIME 和 Lucky13 攻击针对的是 TLS 实现,而非 AES 本身。
  • 侧信道攻击。缓存时序分析和功耗分析已从受限设备中提取出 AES 密钥;AES-NI 在桌面端基本消除了这一威胁。

AES-256 也无法证明文件发送者的身份。要实现这一点,需要结合 Ed25519 或 ECDSA 数字签名。

"军事级"大多是营销话术

这个词之所以流行,是因为 NSA 于 2003 年在 CNSSP-15 中批准 AES-256 用于绝密数据。这是真实的,但那已经是 20 多年前的事了。事实上,AES-128 已获批用于秘密级别,对大多数民用场景同样足够。从 128 位升级到 256 位,主要是为了对抗量子计算的未来威胁:Grover 算法理论上将对称密钥安全性减半,把 AES-256 的有效强度降至 128 位,而这依然是安全的。

实际上,在 AES-NI 加速下,AES-256 比 AES-128 仅多消耗约 40% 的 CPU,且获得了普遍支持,因此即便 128 位已足够,AES-256 也已成为默认选择。

如何验证服务真正使用了 AES-256-GCM

三种核实方式:

  1. 阅读安全白皮书。可信的服务(Tresorit、Proton Drive、SwissTransfer、HexaTransfer)会公布确切的模式和 IV 处理方式。
  2. 检查客户端代码。打开 DevTools,在 JavaScript 包中搜索 AES-GCMaes-256-gcm,应能明确看到。
  3. 查找第三方审计报告。Cure53、NCC Group 和 Trail of Bits 发布的审计报告会点名所审查的算法。

危险信号:只说"银行级加密"而不指定模式、使用任何形式的"专有算法",或引用 AES-128-ECB。

立即付诸实践

要安全地发送一份敏感文件:选择明确声明使用 AES-256-GCM、每个文件使用 96 位随机 IV、并在浏览器端(而非服务器)运行加密的服务。配合使用通过 Argon2id 或 PBKDF2(60 万次以上迭代)派生的 16 位以上口令短语。

在 hexatransfer.com 上试试 — 免费、无需注册、最多 10 GB。

通过端到端加密安全发送大文件

通过端到端加密免费传输最大10GB的文件。无需注册账户。文件在上传前在浏览器中加密,其他人无法读取。

发送文件