Безкоштовний інструмент приватності
Зашифруйте файл у своєму браузері
Оберіть файл, задайте парольну фразу й завантажте зашифровану копію. 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 шифрує за один раз. Потокової обробки немає, тож увесь файл під час роботи лежить у пам’яті у дво- чи триразовому обсязі. Сотні мегабайтів на більшості пристроїв — нормально. Для багатогігабайтних архівів беріть настільний інструмент. Зашифрований результат також розкриває приблизний розмір файлу. Назва зашифрована всередині, але розмір не приховано.
Формат, байт за байтом
Усе, що потрібно технічному читачеві, щоб незалежно перевірити те, що видає ця сторінка, або розшифрувати це двадцятьма рядками Python:
| bytes | field | contents |
|---|---|---|
| 0–7 | magic | ASCII "SBXF0001" |
| 8 | версія | 0x01 |
| 9 | алгоритм | 0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256 |
| 10–13 | ітерації | uint32, big-endian (600 000) |
| 14–29 | сіль | 16 байтів |
| 30–41 | одноразове число | 12 байтів |
| 42–кінець | шифротекст | 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, відкалібрований під ваш пристрій, ключі в Secure Enclave і приховані сейфи, для яких ніде не зберігається ні перелік, ні кількість.
iPhone та iPad · iOS 17+ · Безкоштовно