免费隐私工具

在浏览器中加密文件

选一个文件,设一个密码短语,下载一份加密副本。AES-256-GCM,密钥就在你的浏览器里派生。绝无上传,加载后可离线使用。格式在下方逐字节写有文档,你不必对我们的任何话照单全收。

完全在此标签页中运行。绝无上传,加载后可离线使用。

任何文件都行。大文件需要内存。见下方“诚实的局限”。

没有任何恢复手段。忘记密码短语,就意味着这个文件没有人能再打开,包括我们。

每个参数,公开说明

加密算法
AES-256-GCM(WebCrypto),128 位标签
密钥派生
PBKDF2-HMAC-SHA-256,600,000 次迭代
KDF 盐值
16 字节,CSPRNG,每个文件新生成
GCM 随机数
12 字节,CSPRNG,每个文件新生成
认证数据
整个 42 字节头部,因此篡改任何声明的参数都会使解密失败
密码短语编码
UTF-8,NFC 规范化(同一短语在任何设备上输入都派生同一密钥)

诚实的局限

这不是 Sealby 应用的保险库格式。应用用按设备校准的 Argon2id 派生密钥,把密钥包裹在 Secure Enclave 中,并把内容存放在可否认的分块容器里。这些没有一样是网页能做到的。本页是一个基于浏览器原生能力构建的独立工具。

PBKDF2 不是内存困难的。它是浏览器唯一原生自带的密钥派生函数,600,000 次迭代让每次猜测都变慢,但 GPU 破解设备攻击它仍远快于攻击 Argon2id。因此保护都押在你的密码短语上:四个或更多随机单词,而不是一个密码。

WebCrypto 一次性完成加密。没有流式处理,处理期间整个文件会以两到三倍的体积占用内存。几百 MB 在大多数设备上没问题。数 GB 的归档请用桌面工具。加密输出还会透露文件的大致大小。文件名加密在内部,但大小不被隐藏。

格式,逐字节

技术读者独立验证本页输出所需的一切,或者用二十行 Python 解密它:

bytesfieldcontents
0–7magicASCII "SBXF0001"
8version0x01
9algorithm0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256
10–13iterationsuint32,大端序(600,000)
14–29salt16 字节
30–41nonce12 字节
42–endciphertext载荷的 AES-256-GCM 密文,AAD = 字节 0–41;最后 16 字节为 GCM 标签

加密前的载荷:[2 字节名称长度,大端序][文件名,UTF-8][文件字节]。原始文件名以加密形式随行;解密时恢复。

参考解密器(Python,cryptography 库)
import sys, hashlib, struct, unicodedata
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SBXF0001" and raw[8] == 1 and raw[9] == 1
iters = struct.unpack(">I", raw[10:14])[0]          # 600000
salt, nonce, ct = raw[14:30], raw[30:42], raw[42:]
phrase = unicodedata.normalize("NFC", sys.argv[2]).encode()
key = hashlib.pbkdf2_hmac("sha256", phrase, salt, iters, 32)
plain = AESGCM(key).decrypt(nonce, ct, raw[:42])     # AAD = header
name_len = struct.unpack(">H", plain[:2])[0]
name = plain[2 : 2 + name_len].decode()
open(name, "wb").write(plain[2 + name_len :])
print("decrypted ->", name)

这是演示。保险库才是产品。

一个文件、一个密码短语、一个页面。这是浏览器能做到的。Sealby 把它做到位:按你的设备校准的 Argon2id、存于 Secure Enclave 的密钥,以及不留存任何列表或数量的隐藏保险库。

在 App Store 下载

iPhone 和 iPad · iOS 17+ · 免费