Nemokamas privatumo įrankis

Užsandarink failą

Užšifruok failą nauju vienkartiniu raktu ir siųsk jį bet kokiu kanalu. Kas turi raktą, atidaro jį čia pat, šiame puslapyje. Niekas niekada neįkeliama į serverį, nėra slaptafrazės, kurią būtų galima nulaužti, o ką turi viduje, pamatai dar prieš ką nors išsaugant.

Viskas vyksta šioje kortelėje. Šis puslapis apskritai negali susisiekti su jokiu serveriu.

Kiekvienas parametras – atvirai

Šifras
AES-256-GCM (WebCrypto), 128 bitų žyma kiekvienai daliai
Raktas
256 bitai iš naršyklės CSPRNG, generuojamas iš naujo kiekvienam sandarinimui, naudojamas vieną kartą, neišvedamas iš nieko
Skaidymas dalimis
užšifruotas manifestas (failo pavadinimas, dydis, tipas), po to failas po 1 MiB dalimis – kiekviena autentifikuojama atskirai
Nonce
32 bitų atsitiktinė sandarinimo druska ‖ 64 bitų dalies skaitiklis – niekada nepasikartoja viename faile, o raktas vis tiek naudojamas tik vieną kartą
Autentifikuoti duomenys
visa 16 baitų antraštė bei kiekvienos dalies indeksas ir bendras dalių skaičius – dalių pertvarkymas, sutrumpinimas ar sujungimas su kitomis sugadina dešifravimą
Rakto eilutė
base64url, 47 simboliai: 32 baitų raktas plius 3 baitų SHA-256 kontrolinė suma, todėl klaida sukelia aiškų nepavykimą, o ne šiukšles

Sąžiningi atsakymai apie tai, ką tai daro

Viskas vyksta tavo naršyklėje.

Ir sandarinant, ir atidarant, failas įkeliamas į šio puslapio atmintį, ten AES-256-GCM paleidžiamas tavo naršyklės įmontuotu WebCrypto varikliu, o rezultatas grąžinamas kaip atsisiuntimas. Niekas neįkeliama į serverį. Nėra jokios paskyros ir jokio apdorojimo serverio pusėje. Skirtingai nei likusi šios svetainės dalis, šis puslapis net neįkelia slapukų nenaudojančio apsilankymų skaitiklio. Jokios analitikos.

Tai ne vien pažadas. Puslapis pateikiamas su Content-Security-Policy antrašte, kuri leidžia naršyklei gauti tik šios svetainės pačios statinius failus. Jis neturi jokio būdo išsiųsti tavo failo, rakto ar bet ko kito į bet kokį serverį, įskaitant mūsų. Sandarinant atsidaryk naršyklės kūrėjo įrankius ir pamatysi nulį užklausų. Aiškiausias įrodymas: įsidiek Toolbox ir sandarink lėktuvo režimu. Kai tinklas išjungtas, niekas negali išeiti.

Raktas yra viskas – ir mes jo niekada neturime.

Kiekvienas sandarinimas tavo naršyklėje sukuria naują atsitiktinį 256 bitų raktą. Jis tau parodomas vieną kartą ir niekur nesaugomas: nei mūsų sistemose (jos apskritai nedalyvauja), nei tavo naršyklės saugykloje, nei užsandarintame faile. Nėra slaptafrazės, kurią būtų galima atspėti, ir nėra ko laužti brutalia jėga. Kas turi raktą ir failą, gali jį atidaryti. Kas neturi – negali.

Tai turi griežtą pasekmę: jei raktas prarastas, failas dingsta. Nėra jokio atstatymo, jokio pagalbos bilieto, jokio atkūrimo. Tai nėra mūsų nenoras padėti. Kopija, kurią mes galėtume atkurti, būtų kopija, kurią kas nors galėtų pavogti arba pareikalauti.

Nuoroda su raktu niekada nepasiekia serverio.

Bendrinimo nuoroda įrašo raktą už ženklo # URL adrese. Ši dalis, vadinama fragmentu, lieka naršyklėje. Ji niekada neįtraukiama į tai, ką naršyklė siunčia bet kokiam serveriui – nei mūsų, nei bet kieno kito. Kai šis puslapis pasikrauna su raktu nuorodoje, jis nuskaito raktą, perjungia į skirtuką Atidaryti ir iš karto pašalina raktą iš adreso juostos. Taip jis neužsilieka nei matomame URL adrese, nei naršyklės istorijoje.

Vis dėlto kas turi ir nuorodą, ir užsandarintą failą, gali jį atidaryti. Būtent todėl šis puslapis pataria failą ir raktą siųsti skirtingais kanalais.

Ką turi viduje, matai dar prieš ką nors išsaugant.

Atidarymas vyksta dviem žingsniais. Pirmiausia puslapis dešifruoja tik nedidelį manifestą: originalų failo pavadinimą, dydį ir tipą. Jis tai parodo, su aiškiu įspėjimu apie failų tipus, galinčius vykdyti kodą (programas, skriptus, diegimo programas, dokumentus su makrokomandomis, HTML), ir apie pavadinimus, užmaskuotus dviguba plėtiniu, pvz., invoice.pdf.exe. Niekas neįrašoma, kol nepaspaudi dešifruoti. Puslapis pats niekada neatidaro ir nepateikia dešifruoto turinio. Jis tik pasiūlo failą atsisiųsti.

Svarbu aiškiai suprasti, ką šifravimas įrodo, o ko ne. Užsandarintas failas yra konfidencialus siuntimo metu. Sandarinimas nieko nesako nei apie tai, kas jį atsiuntė, nei apie tai, ar jo turinys saugus. Į netikėtą užsandarintą failą žiūrėk taip pat įtariai, kaip į netikėtą priedą.

Kur iš tikrųjų yra pasitikėjimo riba.

Tu vykdai kodą, kurį tau pateikė ši svetainė. Jei sealby.app ar tavo ryšys su juo būtų pažeistas, kenkėjiškas puslapis galėtų perskaityti tai, ką į jį įvedi. Tai tiesa apie kiekvieną žiniatinklio šifravimo įrankį, ir mums geriau tai pasakyti, nei apsimesti kitaip. Ką dėl to darome: puslapis yra statinis failas, ir mes jį laikome be trečiųjų šalių kodo. Įdiegtas Toolbox leidžia tau toliau naudoti versiją, kurią jau įkėlei. O formatas žemiau dokumentuotas, kad prieš jį būtų galima kurti nepriklausomus įrankius.

Tavo paties įrenginys taip pat yra šioje riboje. Naršyklės plėtiniai su prieiga prie puslapio arba kenkėjiška programa kompiuteryje gali perskaityti viską, ką gali perskaityti bet kuris puslapis. Užsandarintas failas paslepia savo turinį, bet ne viską. Kas jį turi, mato jo dydį (apytiksliai atitinkantį originalo dydį) ir tai, kad tai Sealby užsandarintas failas.

Apribojimai paprastai

  • Prarastas raktas = prarastas failas. Jokių išimčių. Taip sumanyta.
  • Mes nematome tavo failų ar raktų, todėl negalime jų patikrinti dėl kenkėjiškų programų. Įspėjimas apie failo tipą remiasi tik failo pavadinimu. Tai nėra saugumo garantija.
  • Kas turi ir užsandarintą failą, ir raktą, gali jį atidaryti. Įrankis nežino ir netikrina, kas tai yra.
  • Užsandarinto failo dydis apytiksliai atskleidžia originalaus failo dydį.
  • Vienas failas, iki 100 MB, vienam sandarinimui. Kelis failus pirmiausia suarchyvuok į zip.

Formatas, baitas po baito

Viskas, ko technikui reikia, kad nepriklausomai patikrintų šio puslapio rezultatą arba atidarytų .sealed failą trisdešimtyje Python eilučių:

bytesfieldcontents
0–7magicASCII "SEALBY-W"
8versija0x01 – bet kas kita atmetama kaip „sukurta naujesne versija“
9algoritmas0x01 = AES-256-GCM
10–13sandarinimo druska4 baitai, CSPRNG, nauja kiekvienam sandarinimui
14–15rezervuotaturi būti nulis
16–pabaigadalių kadraikiekvienas: uint32 BE šifruoto teksto ilgis, po to AES-GCM šifruotas tekstas + 16 baitų žyma

0 dalis yra manifestas: UTF-8 JSON {"name":…,"size":…,"type":…}. Dalys 1…N−1 – tai failas, padalytas 1 MiB dalimis. Kiekvienai daliai i iš N: nonce = druska ‖ uint64 BE i; autentifikuoti duomenys = antraštė ‖ uint64 BE i ‖ uint64 BE N. Todėl pakeitimas, sutrumpinimas, pertvarkymas, perkėlimas ir dalių sujungimas iš skirtingų failų – visa tai nepraeina autentifikacijos. Kiekvienas atvejis įrodytas įrašytu neigiamu testu.

Rakto eilutė: base64url (be užpildymo) iš 32 baitų rakto, po kurio seka pirmieji 3 SHA-256 baitai, iš viso 47 simboliai. Klaida sukelia kontrolinės sumos nepavykimą, o ne šiukšles.

Pavyzdinis atidarymo įrankis (Python, cryptography biblioteka)
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"])

Tai skirta failams kelyje. Seifas – failams, kurie lieka.

Sandarinimas apsaugo failą, kol jis keliauja kažkur. Sealby apsaugo viską, kas lieka: nuotraukas, failus ir užrašus šifruotuose seifuose tavo iPhone telefone. Jokios paskyros, jokio serverio, ir tai perskaityti gali tik tu.

Atsisiųsti iš App Store

iPhone ir iPad · iOS 17+ · Nemokama