Darmowe narzędzie prywatności
Zaszyfruj plik w przeglądarce
Wybierz plik, wybierz frazę hasłową i pobierz zaszyfrowaną kopię. AES-256-GCM, z kluczem wyprowadzonym w twojej przeglądarce. Nic nie jest wysyłane, a po wczytaniu działa offline. Format jest opisany bajt po bajcie poniżej, więc niczego nie musisz brać na słowo.
Działa w całości w tej karcie. Nic nie jest wysyłane, a po wczytaniu działa offline.
Dowolny plik. Duże pliki potrzebują pamięci. Zobacz uczciwe ograniczenia poniżej.
Nie ma odzyskiwania. Zapomniana fraza hasłowa oznacza plik, którego nikt, łącznie z nami, nigdy nie otworzy.
Każdy parametr, wyłożony wprost
- Szyfr
- AES-256-GCM (WebCrypto), tag 128-bitowy
- Wyprowadzanie klucza
- PBKDF2-HMAC-SHA-256, 600 000 iteracji
- Sól KDF
- 16 bajtów, CSPRNG, świeża dla każdego pliku
- Nonce GCM
- 12 bajtów, CSPRNG, świeży dla każdego pliku
- Dane uwierzytelniane
- cały 42-bajtowy nagłówek, więc manipulacja przy dowolnym zadeklarowanym parametrze psuje odszyfrowanie
- Kodowanie frazy hasłowej
- UTF-8, znormalizowane NFC (dzięki czemu ta sama fraza wpisana na dowolnym urządzeniu daje ten sam klucz)
Uczciwe ograniczenia
To nie jest format sejfu z aplikacji Sealby. Aplikacja wyprowadza klucze Argon2id skalibrowanym pod każde urządzenie, opakowuje je w Secure Enclave i trzyma treść w zaprzeczalnych, dzielonych na fragmenty kontenerach. Strona internetowa nie potrafi nic z tego. Ta strona to samodzielne narzędzie zbudowane na tym, co przeglądarki oferują natywnie.
PBKDF2 nie wymaga dużo pamięci. To jedyna funkcja wyprowadzania klucza, którą przeglądarki dostarczają natywnie, a 600 000 iteracji spowalnia każdą próbę, ale maszyna z GPU wciąż atakuje ją znacznie szybciej niż Argon2id. Ochrona leży więc w twojej frazie hasłowej: cztery losowe słowa albo więcej, a nie hasło.
WebCrypto szyfruje jednym zamachem. Nie ma strumieniowania, więc cały plik siedzi w pamięci dwa–trzy razy naraz podczas przetwarzania. Setki megabajtów są w porządku na większości urządzeń. Do wielogigabajtowych archiwów użyj narzędzia desktopowego. Zaszyfrowany wynik ujawnia też przybliżony rozmiar pliku. Nazwa jest zaszyfrowana w środku, ale rozmiar nie jest ukryty.
Format, bajt po bajcie
Wszystko, czego techniczny czytelnik potrzebuje, by niezależnie zweryfikować wynik tej strony albo odszyfrować go w dwudziestu liniach Pythona:
| bytes | field | contents |
|---|---|---|
| 0–7 | magic | ASCII "SBXF0001" |
| 8 | wersja | 0x01 |
| 9 | algorytm | 0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256 |
| 10–13 | iteracje | uint32, big-endian (600 000) |
| 14–29 | sól | 16 bajtów |
| 30–41 | nonce | 12 bajtów |
| 42–koniec | szyfrogram | AES-256-GCM ładunku, AAD = bajty 0–41; ostatnie 16 bajtów to tag GCM |
Ładunek przed zaszyfrowaniem: [2-bajtowa długość nazwy, big-endian][nazwa pliku, UTF-8][bajty pliku]. Oryginalna nazwa pliku podróżuje zaszyfrowana; przy odszyfrowaniu jest przywracana.
Referencyjny deszyfrator (Python, biblioteka 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)To jest demo. Produktem jest sejf.
Jeden plik, jedna fraza hasłowa, jedna strona. Tyle potrafi przeglądarka. Sealby robi to porządnie: Argon2id skalibrowany pod twoje urządzenie, klucze w Secure Enclave i ukryte sejfy bez żadnej przechowywanej listy ani ich liczby.
iPhone i iPad · iOS 17+ · Za darmo