Безкоштовний інструмент приватності

Запечатайте файл

Зашифруйте файл під новим одноразовим ключем і надішліть його будь-яким каналом. Той, хто має ключ, відкриє його просто тут, на цій сторінці. Нічого й ніколи не вивантажується, немає парольної фрази, яку можна зламати, і ви бачите вміст ще до того, як щось буде збережено.

Працює цілком у цій вкладці. Ця сторінка взагалі не може звертатися до жодного сервера.

Кожен параметр — названо

Шифр
AES-256-GCM (WebCrypto), 128-бітний тег на кожен блок
Ключ
256 бітів із CSPRNG браузера, генерується заново для кожного запечатування, використовується один раз, ні з чого не виводиться
Поділ на блоки
зашифрований маніфест (ім’я файлу, розмір, тип), далі файл блоками по 1 МіБ — кожен автентифікується окремо
Одноразове число
32-бітна випадкова сіль запечатування ‖ 64-бітний лічильник блоків — ніколи не повторюється в межах файлу, та й ключ однаково одноразовий
Автентифіковані дані
увесь 16-байтовий заголовок плюс індекс кожного блока й загальна кількість блоків — переставляння, обрізання чи вклеювання блоків ламає розшифрування
Рядок ключа
base64url, 47 символів: 32-байтовий ключ плюс 3-байтова контрольна сума SHA-256, щоб одруківка чисто відхилялася, а не давала сміття

Чесні відповіді про те, що це робить

Усе відбувається у вашому браузері.

І запечатування, і відкриття читають файл у пам’ять цієї сторінки, виконують там AES-256-GCM вбудованим у ваш браузер рушієм WebCrypto і віддають результат як завантаження. Нічого не вивантажується. Немає ані акаунта, ані обробки на боці сервера. На відміну від решти цього сайту, ця сторінка не завантажує навіть лічильника відвідувань без файлів cookie. Жодної аналітики взагалі.

Це не просто обіцянка. Сторінка віддається з Content-Security-Policy, за якою браузер може завантажувати лише власні статичні файли цього сайту. Вона не має жодного способу надіслати ваш файл, ваш ключ чи будь-що інше на будь-який сервер, зокрема наш. Відкрийте інструменти розробника у браузері під час запечатування — і ви побачите нуль запитів. Для найпрямішого доказу встановіть Набір інструментів і запечатуйте в режимі польоту. З вимкненою мережею нічого не може вийти назовні.

Ключ — це все, і в нас його ніколи немає.

Кожне запечатування генерує у вашому браузері новий випадковий 256-бітний ключ. Його показують вам один раз і не зберігають ніде: ні в наших системах (їх тут узагалі немає), ні у сховищі вашого браузера, ні в запечатаному файлі. Немає парольної фрази, яку можна вгадати, і нічого, що піддається перебору. Хто має ключ і файл, той відкриє. Хто не має — ні.

З цього випливає жорсткий наслідок: якщо ключ втрачено, файл зник. Немає ні скидання, ні звернення в підтримку, ні відновлення. Річ не в тому, що ми не хочемо допомогти. Копія, яку ми могли б відновити, була б копією, яку хтось міг би вкрасти чи витребувати.

Посилання з ключем ніколи не досягає сервера.

Посилання для обміну ставить ключ після # в URL. Ця частина — фрагмент — лишається в браузері. Вона ніколи не входить у те, що браузер надсилає на будь-який сервер, наш чи чийсь. Коли ця сторінка завантажується з ключем у посиланні, вона зчитує ключ, перемикається на вкладку «Відкрити» й одразу прибирає ключ з адресного рядка. Тож він не затримується у видимому URL чи в історії браузера.

І все ж будь-хто, у кого є і посилання, і запечатаний файл, може його відкрити. Саме тому ця сторінка каже надсилати файл і ключ різними каналами.

Ви бачите, що всередині, ще до того, як щось буде збережено.

Відкриття відбувається у два кроки. Спершу сторінка розшифровує лише невеликий маніфест: оригінальну назву файлу, розмір і тип. Вона показує його вам, із гучним попередженням для типів файлів, здатних виконувати код (програми, скрипти, інсталятори, документи з макросами, HTML), і для назв, замаскованих подвійним розширенням на кшталт invoice.pdf.exe. Нічого не записується, доки ви не натиснете «розшифрувати». Сама сторінка ніколи не відкриває й не показує розшифрований вміст. Вона лише пропонує файл до завантаження.

Чітко розумійте, що шифрування доводить, а чого ні. Запечатаний файл конфіденційний у дорозі. Запечатування нічого не каже про те, хто його надіслав і чи безпечний його вміст. Ставтеся до несподіваного запечатаного файлу так само скептично, як до несподіваного вкладення.

Де насправді пролягає межа довіри.

Ви виконуєте код, який вам віддав цей вебсайт. Якби sealby.app або ваше з’єднання з ним були скомпрометовані, зловмисна сторінка могла б прочитати те, що ви в неї вводите. Це справедливо для кожного вебінструмента шифрування, і ми радше скажемо це, ніж робитимемо вигляд, що це не так. Що ми з цим робимо: сторінка є статичним файлом, і ми тримаємо її вільною від стороннього коду. Встановлений Набір інструментів дозволяє й далі користуватися вже завантаженою версією. А формат задокументовано нижче, тож під нього можна створювати незалежні інструменти.

Ваш власний пристрій теж усередині цієї межі. Розширення браузера з доступом до сторінки або шкідливе ПЗ на машині можуть прочитати все, що може прочитати будь-яка сторінка. Запечатаний файл приховує свій вміст, але не все. Той, хто його має, бачить його розмір (приблизно як в оригіналі) і те, що це файл, запечатаний Sealby.

Межі простими словами

  • Втрачений ключ = втрачений файл. Без винятків, за задумом.
  • Ми не бачимо ваших файлів чи ключів, тож не можемо й перевірити їх на шкідливе ПЗ. Попередження про тип файлу ґрунтується лише на назві файлу. Це не гарантія безпеки.
  • Будь-хто, у кого є і запечатаний файл, і ключ, може його відкрити. Інструмент не знає й не перевіряє, хто це.
  • Розмір запечатаного файлу приблизно розкриває розмір оригінального файлу.
  • Один файл, до 100 МБ, за одне запечатування. Кілька файлів спершу запакуйте в zip.

Формат, байт за байтом

Усе, що потрібно технічному читачеві, щоб незалежно перевірити те, що видає ця сторінка, або відкрити файл .sealed тридцятьма рядками Python:

bytesfieldcontents
0–7magicASCII "SEALBY-W"
8версія0x01 — будь-що інше відхиляється як «створене новішою версією»
9алгоритм0x01 = AES-256-GCM
10–13сіль запечатування4 байти, CSPRNG, нова для кожного запечатування
14–15зарезервованомає бути нулем
16–кінецькадри блоківкожен: uint32 BE довжина шифротексту, далі шифротекст AES-GCM + 16-байтовий тег

Блок 0 — це маніфест: JSON у UTF-8 {"name":…,"size":…,"type":…}. Блоки 1…N−1 — це файл шматками по 1 МіБ. Для блока i з N: одноразове число = сіль ‖ uint64 BE i; автентифіковані дані = заголовок ‖ uint64 BE i ‖ uint64 BE N. Тож підміна, обрізання, переставляння, переміщення та вклеювання з іншого файлу не проходять автентифікацію. Кожен випадок підтверджено закріпленим негативним тестом.

Рядок ключа: base64url (без доповнення) з 32-байтового ключа, за яким ідуть перші 3 байти його SHA-256, загалом 47 символів. Одруківка не проходить контрольну суму, а не дає сміття.

Еталонний код для відкриття (Python, бібліотека cryptography)
import base64, hashlib, json, struct, sys
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SEALBY-W" and raw[8] == 1 and raw[9] == 1
assert raw[14:16] == b"\x00\x00"
header, salt = raw[:16], raw[10:14]
frames, off = [], 16
while off < len(raw):
    (n,) = struct.unpack(">I", raw[off:off + 4]); off += 4
    frames.append(raw[off:off + n]); off += n
assert off == len(raw)

kb = base64.urlsafe_b64decode(sys.argv[2] + "=")   # 47-char key string
key, check = kb[:32], kb[32:35]
assert hashlib.sha256(key).digest()[:3] == check    # typo check

N = len(frames)
def chunk(i):
    nonce = salt + struct.pack(">Q", i)
    aad = header + struct.pack(">QQ", i, N)
    return AESGCM(key).decrypt(nonce, frames[i], aad)

manifest = json.loads(chunk(0))
data = b"".join(chunk(i) for i in range(1, N))
assert len(data) == manifest["size"]
open(manifest["name"], "wb").write(data)
print("decrypted ->", manifest["name"])

Це для файлів у дорозі. Сейф — для файлів у спокої.

Запечатування захищає файл на шляху кудись. Sealby захищає все, що лишається: фото, файли й нотатки в зашифрованих сейфах на вашому iPhone. Без акаунта, без серверів, і не прочитає їх ніхто, крім вас.

Завантажити в App Store

iPhone та iPad · iOS 17+ · Безкоштовно