Criptarea simplificată Cum se integrează criptarea sigură
Integrarea criptării în propria aplicație este o dorință comună a dezvoltatorilor. Acest articol este destinat să ofere o scurtă introducere a acestui subiect incredibil de complex. Din păcate, nu există un glonț argintiu pentru criptarea sigură a datelor.

Criptare, dar corect
Înainte chiar să vă gândiți cum să criptați tehnic și ce algoritmi să utilizați, trebuie să faceți un pas înapoi. Integrarea criptării sigure în propria aplicație este mai puțin o întrebare tehnică, dar mai mult una conceptuală.
Prima întrebare la care trebuie răspuns: ce date doresc să protejez de cine? Răspunsul la această întrebare este baza absolută fără de care nu este posibilă utilizarea unei metode sigure de criptare.
Pe de o parte, trebuie clarificat ce date trebuie criptate. La început, sună ca o întrebare simplă, dar nu este deloc. Exemplu: dezvoltați un magazin online sau un sistem CRM și doriți să criptați datele clienților. Sună grozav la început. Dar cum intenționați să prelucrați aceste date atunci? Cum doriți să găsiți din nou aceste date - la început nu este posibilă căutarea datelor criptate.
De la cine vreau să protejez datele?
După ce ați definit ce date ar trebui criptate, apare următoarea întrebare: de la cine vreau să protejez datele?
Următoarele exemple sunt menite să demonstreze scopul acestei întrebări. Doriți să protejați datele de acces pentru baza de date a aplicației dvs. Scenariul este că un atacator găsește un punct slab în aplicația dvs. și poate citi orice date locale. Dacă îl folosește pentru a descărca configurația, cel puțin nu ar trebui să aibă direct datele de acces la baza de date. Prin urmare, este clar că criptarea și decriptarea trebuie să aibă loc pe partea serverului. Fără datele de acces, aplicația dvs. nu poate accesa serverul bazei de date.
Un alt exemplu: doriți să protejați datele de administratorii dvs., deoarece operați un serviciu de mesagerie securizat. Aceasta înseamnă că criptarea și decriptarea trebuie să aibă loc pe client. O soluție alternativă, așa cum am văzut deja într-un test de penetrare, că datele sunt trimise către un server și apoi criptează sau decriptează, nu ajută în acest caz. Datele sunt accesibile în text simplu pe server, chiar dacă sunt doar în memoria principală.
Întrebări importante pentru găsirea arhitecturii corecte de criptare
Am abordat deja cea mai importantă întrebare: "Care date" și din care. „De ce„Este apoi din nou legat de„ cine ”. Acest lucru poate fi folosit pentru a clarifica, "Unde„Criptarea trebuie să aibă loc.
Odată ce toate acestea au fost clarificate, vă puteți dedica implementării tehnice, adică „La fel de".
Criptarea este implementată în siguranță
După cum sa menționat deja, detaliile tehnice ale criptării sunt discutate în acest articol. Gestionarea cheilor este un subiect separat, extrem de complex, care va fi discutat într-un articol de pe blogul următor.
În această secțiune aș dori să vă întreb mai întâi: nu creați propria metodă de criptare. Bruce Schneier a rezumat-o cândva frumos (acum cunoscută sub numele de Legea lui Schneier), pe care aș vrea să o traduc foarte liber:
Oricine poate dezvolta o criptare atât de inteligentă încât nu o poți rupe singur. Provocarea este de a dezvolta una pe care nimeni altcineva nu o poate sparge chiar și după ani de analize.
Din păcate, am avut deja multe audituri în care clienții și-au dezvoltat propriul sistem de criptare și, din păcate, nu a câștigat acest nume o singură dată.
Un al doilea punct important este că, dacă decideți să utilizați un algoritm existent, nu îl implementați singur. Este aproape imposibil să vă gândiți la toate atacurile de pe canalul lateral și la alte atacuri care pot face criptarea inutilă.
Sarea din supă: libsodiu
Din fericire, există astăzi biblioteci care pot face multă treabă atunci când vine vorba de utilizarea criptării. Echipa condusă de Daniel J. Bernstein, Tanja Lange și Peter Schwabe a făcut un mare pas când au lansat proiectul NaCl (pronunțat: sare). NaCl oferă multe funcții care sunt necesare pentru un sistem de criptare sigur. Pe baza acestui fapt, biblioteca „libsodium” a fost dezvoltată, ceea ce o face portabilă și o face accesibilă pentru aproape toate limbajele de programare disponibile. Licența ISC foarte permisivă permite, de asemenea, utilizarea în toate proiectele, chiar dacă acestea sunt comerciale (atenție, împachetările pentru anumite limbaje de programare ar putea utiliza licențe diferite).
Ce face libsodiu pentru tine
Chiar și atunci când aveți un algoritm fundamental sigur, este o provocare enormă să îl implementați în siguranță. Pe de o parte, există atacuri pe canale laterale. Atacul nu are loc direct pe criptare, dar se fac încercări de a trage concluzii despre textul simplu sau cheia utilizată prin ocoliri. libsodium ia deja în considerare această opțiune, motiv pentru care dezvoltatorii nu trebuie să-și facă griji.
Chiar și problemele dificile, cum ar fi umplerea și autentificarea, sunt complet tratate de libsodium. Umplerea este întotdeauna necesară cu cifrele bloc, deoarece acestea pot funcționa numai în blocuri întregi. Cu AES, de exemplu, acestea sunt întotdeauna blocuri de 16 octeți. Dacă datele care urmează să fie criptate au o lungime de numai 8 octeți, restul de 8 octeți trebuie completați. O altă dificultate este autentificarea în criptare. În acest context, autentificarea înseamnă a putea recunoaște manipularea textului cifrat (datele criptate). AES în sine nu oferă autentificare integrată, de exemplu; aceasta este adăugată numai cu modul de cifrare GCM.
În combinație: Problemele legate de umplere și lipsa autentificării pot duce la faptul că textul simplu poate fi restaurat, deoarece un oracol de umplere poate fi posibil.
De altfel, acesta este doar un mic extras din ceea ce poți face greșit cu cripto. Din fericire, libsodium se ocupă de toate problemele de criptare.
Instalarea libsodium
libsodium poate fi compilat de unul singur pe toate platformele. Există, de asemenea, DLL-uri gata preparate pentru Windows. Din păcate, acestea nu sunt semnate digital, motiv pentru care trebuie să verificați singur DLL-urile.
Este păcat că dezvoltatorii semnează cu PGP, dar cheia poate fi găsită doar pe pagina de pornire și nu a fost autentificată de alții. În caz contrar, instrumentul Minisign poate fi încă utilizat, prin care trebuie să aveți încredere în cheia dată pe pagina principală.
Cu toate acestea, este important ca verificarea să aibă loc! Cea mai bună bibliotecă criptografică nu este, desigur, inutilă dacă a fost pregătită și, de exemplu, generează o coincidență proastă sau integrează o altă ușă din spate.
Toate legările pentru alte limbaje de programare se bazează pe libsodium, adică utilizează DLL sau obiectul partajat. Prin urmare, fișierul trebuie integrat înainte de utilizare. Modul în care funcționează exact diferă în funcție de limbajul de programare, dar este descris foarte bine în proiectele individuale.
Ce urmează acum?
Următorul pas este să vă familiarizați cu legăturile limbajului de programare corespunzător și să vă jucați puțin. O notă rapidă: dacă documentația pentru o legare este proastă, luați alta. În Java, de exemplu, există multe biblioteci, dar unele sunt mai bine întreținute și, mai presus de toate, documentate.
Cu toate acestea, în principiu, aș dori să fac următoarele comentarii:
Nu lăsați nimic la voia întâmplării sau cel puțin?
O criptare bună necesită o șansă sigură criptografic. libsodium folosește funcțiile interne ale sistemului de operare pentru a genera date aleatorii, motiv pentru care puteți avea încredere în funcția aleatorie (de ex. randombytes_buf).
Note privind criptarea simetrică
Cu criptarea simetrică, rămâne de spus că nu ar trebui să utilizați o cheie de mai multe ori. Nonce - care provine de la „nu mai mult de o dată” - poate fi folosit doar o dată (!). Generați o nouă nonce din nou și din nou folosind funcția aleatorie.
Dacă utilizați funcția de nivel înalt pentru criptare, libsodium folosește XSalsa20 Stream Cipher pentru criptare și Poly1305 pentru autentificare începând cu octombrie 2017. Există, de asemenea, opțiunea de a utiliza AES-GCM. Acest lucru poate fi un avantaj dacă trebuie să îndepliniți anumite criterii. Acest algoritm este i.a. prin urmare, nu este utilizat ca standard, deoarece este disponibil numai dacă CPU acceptă instrucțiunile AES-NI.
Criptare asimetrică
Cu criptare asimetrică, libsodium oferă funcții pentru generarea perechilor de chei și - așa cum am menționat mai sus - se ocupă de umplere și autentificare. Algoritmii utilizați (începând cu octombrie 2017) sunt X25519 pentru cheie, cifru de flux XSalsa20 pentru criptare și Poly1305 pentru autentificare.
Hashing
Funcțiile de hash pe care le oferă libsodium permit un hash simplu, adică aceeași intrare duce la aceeași ieșire sau combinația cu o parolă pentru un scenariu HMAC. Algoritmul utilizat este (începând din octombrie 2017) BLAKE2b unul dintre finaliștii pentru SHA-3.
parola
Am scris despre acest lucru în articolul nostru despre stocarea în siguranță a parolelor. Din fericire, libsodium oferă deja funcții adecvate pentru stocarea sigură a parolei. În implementarea standard, versiunea curentă a libsodium folosește Argon2.
perspectivă
Vom analiza mai detaliat această problemă critică în următoarele câteva săptămâni. Scopul este să învățați cum să utilizați cel mai bine libsodium și să puteți integra criptarea sigură în aplicația dvs. Dacă este ceva mai acut, desigur vă putem sfătui direct. De asemenea, așteptăm cu nerăbdare feedbackul dvs.!