Problema reală | adware în loc de securitateThe real problem | adware instead of security
Aveam un client care, pe lângă serviciile noastre de IT managed, mai rula și o aplicație hostată pe Remote Desktop, administrată de compania care o crease. De fiecare dată când un angajat nou intra în firmă, trebuia creat un cont în Active Directory. Noi nu aveam acces la acel server | deci rugam cealaltă companie să facă contul și să ne trimită credențialele.
I had a client who, alongside our managed IT services, also ran an application hosted on Remote Desktop, administered by the company that built it. Every time a new employee joined, an account needed to be created in Active Directory. We didn't have access to that server | so we'd ask the other company to create the account and send us the credentials.
Problema era cum le trimiteau. Foloseau un serviciu terț de tipul "notă secretă" care, din păcate, era plin de reclame și instala automat Wave Browser | un browser adware ce se punea pe calculatoare fără să ceară drepturi de administrator. Un PUP (Potentially Unwanted Program) clasic, instalat în exact contextul în care ar fi trebuit să existe maximă atenție la securitate.
The problem was how they sent them. They used a third-party "secret note" service that was packed with ads and automatically installed Wave Browser | an adware browser that installed itself without requesting admin rights. A textbook PUP (Potentially Unwanted Program), deployed in exactly the context where security awareness should have been highest.
„Soluția pentru a trimite credențiale în siguranță era ea însăși un risc de securitate. Suficient de absurd pentru a face ceva în privința asta." "The solution for securely sending credentials was itself a security risk. Absurd enough to do something about it."
Decizia: build, nu searchThe decision: build, don't search
Varianta logică era să caut un alt serviciu. Dar am ales altceva: să construiesc ceva în care să am cu adevărat încredere. Fără reclame, fără tracking, fără cod terț pe care să nu îl pot audita. Tocmai luasem certificarea AWS Cloud Practitioner | momentul perfect să aplic ce tocmai învățasem pe o problemă reală.
The logical option was to find another service. But I chose something different: to build something I could genuinely trust. No ads, no tracking, no third-party code I couldn't audit. I'd just obtained my AWS Cloud Practitioner certification | the perfect moment to apply what I'd just learned to a real problem.
Sunt genul de persoană care învață prin a face. Un curs îți povestește cum funcționează API Gateway și Lambda. Cu totul altceva e să le construiești, să te dai cu capul de security groups, să înțelegi de ce un request eșuează la 3 dimineața, să faci troubleshooting real cu consecințe reale.
I learn by doing. A course tells you how API Gateway and Lambda work. It's something entirely different to actually build them, run into security groups, understand why a request fails at 3am, and do real troubleshooting with real stakes.
Cum funcționează GetMySecretHow GetMySecret works
Fluxul e simplu în trei pași | dar în spatele simplității e o arhitectură gândită să fie imposibil de compromis, nu doar sigură prin promisiune:
The flow is simple in three steps | but behind the simplicity is an architecture designed to be impossible to compromise, not just secure by policy:
1. Scrii secretul. Browserul tău îl criptează local înainte ca un singur byte să plece de pe device, folosind AES-256-GCM. Serverul primește doar textul criptat, complet inutil fără cheia de decriptare. Nu vedem niciodată mesajul original. Tehnic imposibil | nu o promisiune de politică.
1. You write the secret. Your browser encrypts it locally before a single byte leaves your device, using AES-256-GCM. The server receives only the encrypted text, completely useless without the decryption key. We never see the original message. Technically impossible | not a policy promise.
2. Primești un link unic. Linkul conține două lucruri: ID-ul secretului din baza de date și cheia să îl decodezi | ascunsă după simbolul # în URL. Trimiți linkul cum vrei: WhatsApp, Telegram, email, îl citești cu voce tare. Tu poți seta și expiry | 1 oră, 24h, 1 săptămână, sau citire unică.
2. You receive a unique one-time link. The link contains two things: the secret ID from the database and the key to decode it | hidden after the # symbol in the URL. Share it however you like: WhatsApp, Telegram, email, read it out loud. You can also set expiry | 1 hour, 24h, 1 week, or one-read only.
3. Citit o dată, dispărut pentru totdeauna. Destinatarul deschide linkul. Browserul lui decodează mesajul local | pe device-ul lui, nu pe serverele noastre. În momentul decriptării, copia criptată e ștearsă definitiv din baza de date. Fără backup, fără arhivă, fără urmă. Nici noi nu îl putem recupera.
3. Read once, gone forever. The recipient opens the link. Their browser decodes the message locally | on their device, not our servers. The moment it's decrypted, the encrypted copy is permanently deleted from the database. No backup, no archive, no trace. We couldn't recover it even if we wanted to.
Magia din # | de ce nici serverul nu poate vedea cheiaThe # magic | why even the server can't see the key
Acesta e detaliul tehnic care mi-a dat cel mai mare "aha moment". Uită-te la un link GetMySecret:
This is the technical detail that gave me the biggest "aha moment". Look at a GetMySecret link:
#LVACQCEy39gwgWkT3yh+O8i0NyU+yVNNGOqqIGKY7wg=doar în browser
Tot ce vine după # se numește URL fragment. Este un comportament impus de standardul web (RFC), implementat în fiecare browser din lume: fragmentul URL nu este niciodată inclus în request-urile HTTP trimise spre server. Asta nu e o promisiune a noastră | e o proprietate a modului în care funcționează internetul.
Everything after # is called a URL fragment. It's behaviour enforced by the web standard (RFC), implemented in every browser worldwide: the URL fragment is never included in HTTP requests sent to the server. This isn't our promise | it's a property of how the internet works.
Serverul primește ID-ul secretului (pentru a-l căuta în DynamoDB) dar nu primește niciodată cheia de decriptare. Cheia trăiește exclusiv în URL | în browserul celui care trimite și în browserul celui care primește. Serverul e orb față de ea.
The server receives the secret ID (to look it up in DynamoDB) but never receives the decryption key. The key lives exclusively in the URL | in the sender's browser and the recipient's browser. The server is blind to it.
Trimiți cuiva un seif prin poștă, iar combinația o șoptești direct persoanei | fără ca poștașul să o audă vreodată. Serverul nostru e poștașul: livrează seiful, dar nu are combinația și nu poate deschide nimic.
You send someone a safe through the post, while whispering the combination directly to the person | without the postman ever hearing it. Our server is the postman: it delivers the safe, but doesn't have the combination and can't open anything.
Arhitectura AWS | de ce fiecare serviciu e acoloAWS architecture | why each service is there
GetMySecret e 100% serverless. Fără server permanent, fără administrare, fără costuri când nu e trafic.
GetMySecret is 100% serverless. No permanent server, no management, no costs when there's no traffic.
Un detaliu pe care l-am înțeles construind: fiecare funcție Lambda are rolul IAM minim necesar. create-secret poate doar scrie. get-secret poate doar citi. reveal-secret face update și ștergere în aceeași operație atomică | imposibil să le separi. Dacă un atacator ar compromite cumva o funcție, nu ar putea face decât exact ce acea funcție e autorizată | nimic altceva.
A detail I understood while building: each Lambda function has the minimum necessary IAM role. create-secret can only write. get-secret can only read. reveal-secret does update and delete in the same atomic operation | impossible to separate them. If an attacker somehow compromised a function, they could only do exactly what that function is authorised to do | nothing else.
Detalii criptografice | pentru cei curioșiCryptographic details | for the curious
| Component | Detaliu |
|---|---|
| Cipher | AES-256-GCM · criptare autentificată: detectează și modificările, nu doar furtulAES-256-GCM · authenticated encryption: detects tampering in addition to confidentiality |
| Cheie | 256 biți generați aleatoriu per secret via Web Crypto API nativă a browserului | zero biblioteci crypto terțe256-bit randomly generated per secret via the browser's native Web Crypto API | zero third-party crypto libraries |
| IV | 96 biți aleatoriu · unic per criptare · stocat cu ciphertextul · nu e secret în sine96 random bits · unique per encryption · stored with ciphertext · not secret itself |
| Transport cheie | URL #fragment | browserele nu trimit fragmentele în request-uri HTTP, specificat prin RFCURL #fragment | browsers never send fragments in HTTP requests, specified by RFC |
| Motor crypto | Web Crypto API nativă a browserului · zero biblioteci third-partyBrowser-native Web Crypto API · zero third-party libraries |
| At rest | KMS Customer-Managed Key · independent de criptarea default AWSKMS Customer-Managed Key · independent from AWS default encryption |
Nu e marketing. Suntem matematic în imposibilitate de a citi mesajele. Cheia de decriptare nu trece niciodată prin infrastructura noastră. Dacă cineva ne-ar cere datele, am putea preda ciphertextul din DynamoDB | complet inutil fără cheia pe care n-o avem.
It's not marketing. We are mathematically unable to read the messages. The decryption key never passes through our infrastructure. If someone demanded our data, we could hand over the ciphertext from DynamoDB | completely useless without the key we don't have.
Ce am învățat construind de la zeroWhat I learned building from scratch
Una e să asculți un curs despre Lambda și API Gateway. Alta e să le construiești efectiv: să înțelegi de ce un request returnează 403, de ce CORS te blochează cu un mesaj criptic, cum să configurezi IAM policies restrictive fără să blochezi tot, cum funcționează TTL în DynamoDB ca secretele să se șteargă automat la expirare fără niciun cost suplimentar.
One thing is watching a course about Lambda and API Gateway. Another is actually building them: understanding why a request returns 403, why CORS blocks you with a cryptic message, how to configure restrictive IAM policies without breaking everything, how DynamoDB TTL works so secrets delete themselves at expiry at zero additional cost.
Am înțeles concret ce înseamnă "serverless" ca arhitectură, nu ca buzzword: zero administrare de server, scalare automată, plată per cerere. Și că securitatea e mai ușor de implementat corect când arhitectura te forțează | fără server de administrat, suprafața de atac e mult mai mică prin construcție.
I concretely understood what "serverless" means as an architecture, not a buzzword: zero server management, automatic scaling, pay per request. And that security is easier to implement correctly when the architecture forces you | without a server to manage, the attack surface is smaller by design.
Cel mai satisfăcător detaliu rămâne: nici eu, cu acces complet la contul AWS și la toată infrastructura, nu pot vedea conținutul unui secret fără linkul complet. Nu e o promisiune | e o consecință matematică a arhitecturii.
The most satisfying detail remains: even I, with full access to the AWS account and all infrastructure, cannot see the content of a secret without the complete link. It's not a promise | it's a mathematical consequence of the architecture.
Susține proiectulSupport the project
GetMySecret supraviețuiește din fonduri proprii. Fără reclame, fără tracking, fără date vândute. Dacă îl folosești și consideri că merită, poți dona prin pagina de Ko-fi disponibilă pe getmysecret.com în secțiunea Supporters. Nicio sumă nu e prea mică și nicio donație nu e obligatorie | îl poți folosi gratuit pentru totdeauna.
GetMySecret runs on personal funds. No ads, no tracking, no data selling. If you use it and think it's worth it, you can donate through the Ko-fi page on getmysecret.com in the Supporters section. No amount is too small and no donation is required | free forever.
Documentația tehnică completă | arhitectură, model de securitate, detalii criptografice | o găsești direct pe getmysecret.com în secțiunea How it works.
Full technical documentation | architecture, security model, cryptographic details | available directly on getmysecret.com in the How it works section.