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.
Sandarinama…
Užsandarinta.
Tai tavo užšifruotas failas. Be rakto jo neperskaitys niekas. Nei mes, nei bet kas kitas.
Raktas – rodomas tik dabar
Šis raktas egzistuoja tik šiame puslapyje, būtent dabar. Jis niekur nesaugomas ir niekur nesiunčiamas. Jei jį prarasi, failo neatidarys niekas, net mes. Išsaugok jį prieš išeinant.
Arba bendrink raktą kaip nuorodą
Raktas yra už ženklo # nuorodoje. Naršyklės šios dalies niekada nesiunčia jokiam serveriui. Nuoroda atveria šį puslapį su paruoštu skirtuku Atidaryti ir jau įrašytu raktu, o tada pašalina raktą iš adreso juostos.
Failą ir raktą siųsk atskirai.
Kas turi ir užsandarintą failą, ir raktą, gali jį atidaryti. Siųsk juos skirtingais kanalais, pavyzdžiui, failą el. paštu, o nuorodą su raktu – SMS žinute. Taip nė viena pašto dėžutė niekada neturės abiejų.
Raktas nuskaitytas iš tavo nuorodos ir pašalintas iš adreso juostos, todėl neatsiduria tavo istorijoje.
Tikrinama…
Šio užsandarinto failo viduje
Kol kas nieko neišsaugota. Štai ką, jo paties teigimu, turi šis užsandarintas failas:
- Pavadinimas
- Dydis
- Tipas
Atsargiai – šis failo tipas gali vykdyti kodą tavo įrenginyje
Dešifruota.
Failas buvo dešifruotas tavo įrenginyje ir pasiūlytas atsisiųsti. Niekas apie jį niekada neišėjo iš šio puslapio.
Nuo Sealby kūrėjų – šifruoto seifo iPhone telefonams
Sealby laiko nuotraukas, failus ir užrašus šifruotuose seifuose tavo iPhone telefone. Jokios paskyros, jokio serverio, ir tai perskaityti gali tik tu.
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ų:
| bytes | field | contents |
|---|---|---|
| 0–7 | magic | ASCII "SEALBY-W" |
| 8 | versija | 0x01 – bet kas kita atmetama kaip „sukurta naujesne versija“ |
| 9 | algoritmas | 0x01 = AES-256-GCM |
| 10–13 | sandarinimo druska | 4 baitai, CSPRNG, nauja kiekvienam sandarinimui |
| 14–15 | rezervuota | turi būti nulis |
| 16–pabaiga | dalių kadrai | kiekvienas: 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.
Pilna baitais tiksli specifikacija (FORMAT-WEB-v1) ·Žinomų atsakymų testų vektoriai (JSON)
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.
iPhone ir iPad · iOS 17+ · Nemokama