大文件加密:4MB 分块、300MB 上限与进度
把 1GB 文件一次性读进内存再加密,浏览器标签页大概率直接崩掉。正确做法是分块:读一块、加密一块、写一块,内存占用只与块大小有关,与文件大小无关。
为什么是 4MB 一块
块太小,每块都要走一次加解密调用与一次写盘,开销占比高;块太大,内存峰值高,进度更新也会变粗。
4MB 是折中:内存峰值约几十 MB,进度条每秒能更新多次,取消操作也能在一秒内响应。块大小写在文件头里,解密时按同样的块读取。
取消为什么只能在分块之间
一块数据的加解密是一个原子操作,中途打断会得到一个不完整的结果。所以取消只在块与块之间生效——点取消后,当前这一块会做完再停。
对 4MB 的块来说,这个延迟通常是几十毫秒,用户感知不到。但如果块设得很大(比如 64MB),取消就会有明显延迟,这也是块不能太大的原因之一。
上限为什么是 300MB
上限取决于浏览器可用内存,而不是算法能力。AES-GCM 本身能处理任意长度,但浏览器要为文件内容、密文、下载 blob 各留一份空间。
界面可以切到 100MB 或 1GB:100MB 适合内存较小的手机,1GB 适合桌面端的偶尔需求。超过上限不会「试试看」,而是直接提示——试到一半崩掉会丢掉已完成的部分。
真正的大文件(几十 GB)不适合在浏览器里处理,应该用命令行工具(gpg、age、openssl enc)。
加密大文件的实际耗时
耗时主要在两处:PBKDF2 派生密钥(固定 60 万次,约 0.3–1 秒,与文件大小无关)和分块加解密(与文件大小线性相关)。
现代笔记本上吞吐通常在几百 MB/s,所以 300MB 文件的加密时间以秒计,瓶颈往往在磁盘读写而不是算法。进度条显示的是分块进度,不是剩余时间估算。
上面这些都不用装软件,也不用注册:打开页面就能用。
打开本地文件加密与解密 →常见问题
分块加密会不会降低安全性?
不会。每块都用同一个密钥与递增的 IV 独立认证,任何一块被篡改或替换都会导致该块认证失败。最后一块标记还防住了截断。
能在加密过程中关掉页面吗?
不能。关掉页面会中止处理,已下载的部分不完整且无法解密(缺最后一块标记)。等处理完成、文件下载后再关。
手机上能加密多大的文件?
建议不超过 100MB,并把上限切到 100MB。移动浏览器可用内存有限,大文件容易在编码阶段失败。