Kako funkcionira šifriranje

SG/Send koristi AES-256-GCM simetrično šifriranje, koje se u potpunosti izvršava u Vašem pregledniku. Poslužitelj nikada ne vidi Vaše podatke u čistom tekstu, nazive datoteka ni ključeve za šifriranje. Ova stranica objašnjava točno kako to funkcionira.

Simetrično šifriranje: jedan ključ, dvije operacije

SG/Send koristi simetrično šifriranje — isti ključ šifrira i dešifrira datoteku. Ovo je najjednostavniji i najbrži model šifriranja i, kada se pravilno provede, najsigurniji za prijenos datoteka.

Što je AES-256-GCM?

AES (Advanced Encryption Standard) je algoritam šifriranja koji koriste vlade, banke i vojske diljem svijeta. 256 je veličina ključa u bitovima — postoji 2256 mogućih ključeva, što čini napad grubom silom računalno nemogućim. GCM (Galois/Counter Mode) dodaje autenticirano šifriranje — ne samo da šifrira, već i otkriva je li netko manipulirao šifriranim tekstom.

Zašto simetrično?

Simetrično šifriranje koristi jedan ključ za šifriranje i dešifriranje. To se razlikuje od asimetričnog šifriranja (poput RSA) koje koristi par ključeva. Za prijenos datoteka, simetrično je pravi izbor: brzo je, dobro razumljivo, a Web Crypto API pruža provjerenu implementaciju u svakom modernom pregledniku.

Ključni uvid: ako kontrolirate gdje se ključ generira i kamo putuje, simetrično šifriranje Vam pruža savršenu povjerljivost. SG/Send generira ključ u Vašem pregledniku, a ključ nikada ne dodiruje poslužitelj.

Tok šifriranja: korak po korak

Evo točno što se događa kada šaljete datoteku putem SG/Send.

1

Generiranje ključa

Kada odaberete datoteku, Vaš preglednik generira nasumični 256-bitni AES ključ koristeći Web Crypto API (crypto.subtle.generateKey). Ovo koristi kriptografski siguran generator nasumičnih brojeva operativnog sustava. Ključ postoji samo u memoriji Vašeg preglednika.

Browser Server | | | crypto.subtle.generateKey( | | { name: "AES-GCM", length: 256 }, | | true, | | ["encrypt", "decrypt"] | | ) | | | | Key generated: 3a7f...b2c1 (256 bits) | | Key stays here. Server knows nothing. | | |
2

Generiranje IV

12-bajtni inicijalizacijski vektor (IV) se generira nasumično (crypto.getRandomValues). IV osigurava da šifriranje iste datoteke dva puta proizvede različiti šifrirani tekst. IV nije tajna — dodaje se na početak šifriranog izlaza i šalje zajedno sa šifriranim tekstom.

3

Šifriranje

Datoteka se šifrira u pregledniku pomoću crypto.subtle.encrypt s AES-GCM algoritmom, generiranim ključem i IV-om. Izlaz je šifrirani tekst + 128-bitna oznaka autentikacije. Oznaka autentikacije je garancija integriteta GCM-a — ako bilo tko promijeni čak i jedan bit šifriranog teksta, dešifriranje će propasti.

Browser Server | | | plaintext ──► AES-256-GCM ──► ciphertext | | ▲ | | | | | key + IV | | | | Output = IV (12 bytes) | | + ciphertext (same size as plaintext) | | + auth tag (16 bytes) | | |
4

Prijenos

Samo se šifrirani izlaz (IV + šifrirani tekst + oznaka autentikacije) prenosi na poslužitelj. Poslužitelj prima blob nasumično izgledajućih bajtova. Dodjeljuje ID prijenosa (12 nasumičnih znakova) i pohranjuje šifrirani tekst. Bez naziva datoteke, bez naznake vrste sadržaja, bez ključa — samo šifrirani bajtovi.

Browser Server | | | POST /transfers/create | | ──────────────────────────────────────────► | | | Stores: | PUT /transfers/{id}/upload | transfer_id: "a7x9k2m4p1" | Body: [IV + ciphertext + auth tag] | data: [encrypted bytes] | ──────────────────────────────────────────► | ip_hash: SHA256(ip + salt) | | timestamp: 2026-02-28T... | Key NEVER sent. File name NEVER sent. | | |
5

Dijeljenje poveznice

Pošiljatelj dobiva poveznicu za preuzimanje. Ključ za dešifriranje stavlja se u URL fragment (dio nakon #). URL fragmente preglednik nikada ne šalje na poslužitelj — to je definirano u RFC 3986. Pošiljatelj dijeli ovu poveznicu putem bilo kojeg kanala koji odabere (e-pošta, chat, osobno).

Link format: https://send.sgraph.ai/download/a7x9k2m4p1#3a7f...b2c1 ├──────────── domain ────────────┤├─ transfer id ─┤├─ key ─┤ ▲ │ URL fragment (#) Never sent to server Stays in the browser
6

Dešifriranje

Primatelj otvara poveznicu. Njihov preglednik preuzima šifrirane bajtove s poslužitelja, izvlači ključ iz URL fragmenta, odvaja IV od šifriranog teksta i dešifrira pomoću crypto.subtle.decrypt. Ako se oznaka autentikacije ne podudara (otkrivena manipulacija), dešifriranje propada. Poslužitelj nikada ne sudjeluje u dešifriranju.

Recipient's Browser Server | | | GET /transfers/{id}/download | | ──────────────────────────────────────────► | | ◄────────────────────────────────────────── | | Response: [IV + ciphertext + auth tag] | | | | Key extracted from URL fragment (#) | | crypto.subtle.decrypt( | | { name: "AES-GCM", iv: IV }, | | key, | | ciphertext | | ) | | | | ──► plaintext file restored | | Server never saw the key or the plaintext. |

Što poslužitelj vidi naspram onoga što ne vidi

Ovo je garancija nultog znanja. Evo točno koji podaci postoje na poslužitelju.

Poslužitelj pohranjuje

ID prijenosa — nasumičnih 12 znakova
Šifrirani bajtovi — nerazlučivi od nasumičnih podataka
IP hash — SHA-256 IP adrese + dnevno rotirajuća sol
Vremenska oznaka — kada je prijenos kreiran
Veličina datoteke — veličina šifriranog bloba (bajtovi)

Poslužitelj nikada ne vidi

Ključ za šifriranje — ostaje u pregledniku, dijeli se putem URL fragmenta
Naziv datoteke — nikada se ne šalje na poslužitelj
Vrsta datoteke — ne pohranjuju se metapodaci o vrsti sadržaja
Sadržaj u čistom tekstu — samo šifrirani tekst se prenosi
Neobrađena IP adresa — hashirana prije pohrane

Potpuna kompromitacija poslužitelja — potpuni pristup bazi podataka, sve sigurnosne kopije, svi zapisnici — ne otkriva ništa o sadržaju prenesenih datoteka. Šifrirani tekst je računalno nerazlučiv od nasumičnog šuma bez ključa.

Tehnološki stog

Svaki sloj odabran je radi jednostavnosti, sigurnosti i implementacije bez ovisnosti.

Sloj Tehnologija Namjena
Runtime Python 3.12 / arm64 Programski jezik aplikacijskog poslužitelja
Web okvir FastAPI via osbot-fast-api HTTP usmjeravanje i obrada zahtjeva
Računanje AWS Lambda + Mangum Serverless izvršavanje, plaćanje po korištenju
Pohrana Memory-FS (Storage_FS) Zamjenjivi pozadinski sustav: memorija, disk ili S3
Šifriranje Web Crypto API (AES-256-GCM) Šifriranje na strani klijenta u pregledniku
Sustav tipova Type_Safe (osbot-utils) Definicije shema bez Pydantic
Frontend Vanilla JS + Web Components Nula ovisnosti o okvirima (IFD)
Testiranje pytest, stog u memoriji Bez mock-ova, bez patch-eva, stvarne implementacije
CI/CD GitHub Actions Cjevovod za testiranje, označavanje i implementaciju

Arhitektura sustava

Dvije Lambda funkcije, jedan sloj pohrane, jedan CDN. Jednostavno po dizajnu.

User Lambda (Javna)

Javna funkcija koja obrađuje prijenose datoteka, provjere zdravlja, unaprijed potpisane prijenose, osobne trezore i MCP integraciju. Pristupa se putem Lambda Function URL iza CloudFront.

18 krajnjih točaka

Admin Lambda (Autenticirana)

Funkcija samo za administratore za upravljanje tokenima, analitiku, statistike poslužitelja i MCP administratorske alate. Zahtijeva autentikaciju. Zasebna Lambda = zasebna sigurnosna granica.

55 krajnjih točaka

Memory-FS (Storage_FS)

Sva pohrana prolazi kroz sloj apstrakcije. Aplikacijski kod nikada ne zna je li pozadinski sustav u memoriji, na disku ili S3. Ista baza koda na svih 7 ciljeva implementacije bez promjene jednog retka aplikacijske logike.

Zamjenjivi pozadinski sustav

CloudFront CDN

Statički resursi, predmemoriranje, SSL terminacija i WAF. Lambda URL-ovi pružaju HTTPS krajnje točke izravno — nije potreban API Gateway.

Rubna mreža

Ciljevi implementacije

Jedna baza koda, sedam ciljeva implementacije grupiranih u četiri obrasca.

Lambda

Primarna implementacija. Dvije Lambda funkcije iza Lambda Function URLs. Izravne HTTPS krajnje točke, bez potrebe za API Gateway.

Produkcija

Kontejner

Docker, AWS Fargate i GCP Cloud Run. Ista aplikacija pakirana kao kontejner.

Docker / Fargate / GCP

Poslužitelj

EC2 instance i AMI izgradnje. Za timove kojima je potrebna potpuna kontrola nad runtime okruženjem.

EC2 / AMI

CLI

Sučelje naredbenog retka za skriptirane prijenose, CI/CD cjevovode i napredne korisnike.

Terminal
18
AI agenata
73
HTTP krajnjih točaka
393
Uspješnih testova
7
Ciljeva implementacije