免費隱私工具

在瀏覽器裡加密檔案

選一個檔案、取一組密碼短語,然後下載加密副本。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 App 的保險庫格式。App 用依裝置校準的 Argon2id 推導金鑰、以安全隔離區包裹金鑰,並把內容存放在可否認的分塊容器中。這些網頁全都做不到。這個頁面是建立在瀏覽器原生能力上的獨立工具。

PBKDF2 不具記憶體硬化性。它是瀏覽器唯一原生提供的 KDF,600,000 次迭代讓每次猜測變慢,但 GPU 破解設備攻擊它的速度仍遠快於 Argon2id。因此,保護的本錢在你的密碼短語身上:四個以上的隨機單字,而不是一組密碼。

WebCrypto 一次完成加密。沒有串流,所以處理期間整個檔案會在記憶體中存放兩到三份。幾百 MB 在大多數裝置上沒問題。數 GB 的壓縮檔請用桌面工具。加密輸出也會透露檔案的大致大小。檔名加密在內部,但大小沒有被隱藏。

格式,逐位元組

技術讀者獨立驗證這個頁面輸出所需的一切,或用二十行 Python 解密它:

bytesfieldcontents
0–7magicASCII "SBXF0001"
8version0x01
9algorithm0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256
10–13iterationsuint32,big-endian(600,000)
14–29salt16 位元組
30–41nonce12 位元組
42–endciphertext酬載的 AES-256-GCM,AAD = 位元組 0–41;最後 16 位元組為 GCM 標籤

加密前的酬載:[2 位元組檔名長度,big-endian][檔名,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、存於安全隔離區的金鑰,以及沒有清單、也沒有數量記錄的隱藏保險庫。

在 App Store 下載

iPhone 與 iPad · iOS 17+ · 免費