Jednoduché šifrovanie Ako integrovať bezpečné šifrovanie

Integrácia šifrovania do vlastnej aplikácie je bežnou túžbou vývojárov. Tento článok má poskytnúť stručný úvod k tejto neuveriteľne zložitej téme. Bohužiaľ neexistuje žiadna strieborná guľka na bezpečné šifrovanie údajov.

bezpečné

Šifrovanie, ale správne

Predtým, ako sa vôbec zamyslíte nad tým, ako technicky zašifrovať a ktoré algoritmy použiť, musíte urobiť krok späť. Integrácia bezpečného šifrovania do vlastnej aplikácie je menej technickou, ale skôr koncepčnou otázkou.

Prvá otázka, na ktorú si treba zodpovedať: Ktoré údaje chcem pred kým chrániť? Odpoveďou na túto otázku je absolútny základ, bez ktorého nie je možné použiť bezpečnú metódu šifrovania.

Na jednej strane musí byť jasné, ktoré údaje by mali byť šifrované. To zo začiatku znie ako jednoduchá otázka, ale vôbec to nie je. Príklad: Vyvíjate online obchod alebo CRM systém a chcete zašifrovať údaje o zákazníkoch. Spočiatku to znie skvele. Ako však potom tieto údaje spracujete? Ako chcete znova nájsť tieto údaje - vyhľadávanie šifrovaných údajov nie je spočiatku možné.

Pred kým chcem chrániť údaje?

Keď už máte definované, ktoré dáta majú byť šifrované, vyvstáva ďalšia otázka: pred kým chcem dáta chrániť?

Nasledujúce príklady sú určené na demonštráciu rozsahu tejto otázky. Chcete chrániť prístupové údaje k databáze vašej aplikácie. Scenár je taký, že útočník nájde vo vašej aplikácii slabé miesto a dokáže prečítať akékoľvek miestne údaje. Ak ho použije na stiahnutie konfigurácie, nemal by mať aspoň priamo prístupové údaje k databáze. Je preto zrejmé, že šifrovanie a dešifrovanie musia prebiehať na strane servera. Bez prístupových údajov nemôže vaša aplikácia získať prístup k databázovému serveru.

Iný príklad: Chcete chrániť údaje pred správcami, pretože prevádzkujete zabezpečenú službu správ. To znamená, že šifrovanie a dešifrovanie musí prebiehať na klientovi. Alternatívne riešenie, ako som už videl pri penetračnom teste, že údaje sa posielajú na server a ten sa potom šifruje alebo dešifruje, v tomto prípade nepomáha. Údaje sú na serveri prístupné v obyčajnom texte, aj keď sú iba v hlavnej pamäti.

Dôležité otázky na nájdenie správnej šifrovacej architektúry

Najdôležitejšej otázke sme sa už venovali: „Ktoré dáta„a z ktorých. „Prečo„Potom opäť súvisí s„ kým “. To možno použiť na objasnenie, “Kde"Šifrovanie musí prebehnúť.".

Keď bude toto všetko objasnené, môžete sa venovať technickej realizácii, t.Ako„.

Šifrovanie je implementované bezpečne

Ako už bolo spomenuté, v tomto článku sa venujeme technickým podrobnostiam šifrovania. Správa kľúčov je samostatná, veľmi zložitá téma, ktorej sa bude venovať nasledujúci článok v blogu.

V tejto časti by som sa vás chcel najskôr opýtať: Nestavajte si svoju vlastnú metódu šifrovania. Bruce Schneier to raz pekne zhrnul (dnes známy ako Schneierov zákon), čo by som chcel preložiť veľmi slobodne:

Ktokoľvek môže vyvinúť šifrovanie, ktoré je také chytré, že ho sami nerozbijete. Výzvou je vyvinúť taký, ktorý nikto iný nedokáže zlomiť ani po rokoch analýzy.

Bohužiaľ sme už mali veľa auditov, v rámci ktorých si zákazníci vyvinuli svoj vlastný kryptosystém a tento názov si bohužiaľ nezaslúžil ani raz.

Druhým dôležitým bodom je, že ak sa rozhodnete použiť existujúci algoritmus, neimplementujte ho sami. Je takmer nemožné myslieť na všetky bočné kanály a ďalšie útoky, vďaka ktorým môže byť šifrovanie zbytočné.

Soľ v polievke: libsodium

Našťastie dnes existujú knižnice, ktoré za vás môžu urobiť veľa práce, pokiaľ ide o šifrovanie. Tím okolo Daniela J. Bernsteina, Tanje Langeovej a Petra Schwabeho urobil veľký krok, keď zahájil projekt NaCl (vyslovuje sa: soľ). NaCl poskytuje mnoho funkcií, ktoré sú potrebné pre bezpečný krypto systém. Na základe toho bola vyvinutá knižnica „libsodium“, ktorá ju robí prenosnou a sprístupňuje ju takmer pre všetky dostupné programovacie jazyky. Veľmi tolerantná licencia ISC umožňuje použitie aj vo všetkých projektoch, aj keď sú komerčné (pozor, obaly určitých programovacích jazykov môžu používať rôzne licencie).

Čo pre vás robí libsodium

Aj keď máte zásadne bezpečný algoritmus, je nesmierne náročné ho bezpečne implementovať. Na jednej strane existujú útoky postrannými kanálmi. Útok neprebieha priamo na šifrovanie, ale robia sa pokusy vyvodiť závery o obyčajnom texte alebo kľúči použitom cez obchádzky. libsodium už túto možnosť zohľadňuje, a preto sa s ňou vývojári nemusia obávať.

Aj také zložité problémy, ako sú vypchávky a autentifikácia, sú libsodium úplne vyriešené. U blokových šifier je vždy potrebné polstrovanie, pretože môžu pracovať iba v celých blokoch. Napríklad pri AES ide vždy o 16-bajtové bloky. Ak sú dáta, ktoré sa majú zašifrovať, iba 8 bajtov dlhé, musí sa vyplniť zvyšných 8 bajtov. Ďalším problémom je autentifikácia v šifrovaní. V tejto súvislosti autentifikácia znamená schopnosť rozpoznať manipuláciu s šifrovaným textom (šifrované dáta). Samotná AES napríklad neponúka integrované overovanie; pridáva sa iba v šifrovacom režime GCM.

V kombinácii: Problémy s výplňou a nedostatok autentifikácie môžu viesť k tomu, že je možné obnoviť obyčajný text, pretože je možné použiť výplň.

Mimochodom, toto je iba malý výňatok z toho, čo môžete v kryptomene urobiť zle. Našťastie sa libsodium stará o všetky problémy so šifrovaním.

Inštalácia libsodia

libsodium si môžete zostaviť sami na všetkých platformách. Existujú tiež pripravené DLL pre Windows. Bohužiaľ, tieto súbory nie sú digitálne podpísané, a preto musíte súbory DLL overovať sami.

Je škoda, že sa vývojári podpisujú pomocou PGP, ale kľúč nájdete iba na domovskej stránke a ostatní ho neoverili. V opačnom prípade je možné naďalej použiť nástroj Minisign, pričom musíte dôverovať kľúču uvedenému na domovskej stránke.

Je však dôležité, aby overenie prebehlo! Najlepšia kryptotéka samozrejme nemá zmysel, ak bola pripravená a napríklad generuje zlú zhodu okolností alebo integruje ďalší backdoor.

Všetky väzby pre ďalšie programovacie jazyky sú založené na knižnici libsodium, t. J. Používajú DLL alebo zdieľaný objekt. Pilník musí byť preto pred použitím integrovaný. To, ako to funguje, sa líši v závislosti od programovacieho jazyka, je však veľmi dobre popísané v jednotlivých projektoch.

Čo ďalej?

Ďalším krokom je oboznámiť sa s väzbami príslušného programovacieho jazyka a trochu si zahrať. Krátka poznámka: ak je dokumentácia pre jednu väzbu zlá, vezmite si inú. Napríklad v Jave existuje veľa knižníc, niektoré sú však lepšie udržiavané a predovšetkým zdokumentované.

V zásade by som však chcel uviesť nasledujúce poznámky:

Nenechajte nič na náhodu, alebo aspoň?

Dobré šifrovanie vyžaduje kryptograficky bezpečnú šancu. libsodium používa na generovanie náhodných údajov vnútorné funkcie operačného systému, a preto môžete náhodnej funkcii dôverovať (napr. randombytes_buf).

Poznámky k symetrickému šifrovaniu

Pri symetrickom šifrovaní zostáva povedať, že by ste kľúč nemali používať viac ako raz. Nonce - ktorá pochádza z výrazu „nie viac ako raz“ - sa môže použiť iba raz (!). Pomocou náhodnej funkcie znovu a znovu generujte nové nonce.

Ak na šifrovanie použijete funkciu na vysokej úrovni, od októbra 2017 bude knižnica libsodium používať na šifrovanie tokovú šifru XSalsa20 a na autentifikáciu Poly1305. K dispozícii je tiež možnosť použiť AES-GCM. To môže byť výhodou, ak musíte splniť určité kritériá. Tento algoritmus sa nepoužíva ako štandard, pretože je k dispozícii, iba ak procesor podporuje pokyny AES-NI.

Asymetrické šifrovanie

S asymetrickým šifrovaním ponúka libsodium funkcie na generovanie dvojíc kľúčov a - ako už bolo spomenuté vyššie - stará sa o vypĺňanie a autentifikáciu. Použité algoritmy (od októbra 2017) sú X25519 pre kľúč, prúdová šifra XSalsa20 na šifrovanie a Poly1305 na autentifikáciu.

Hašovanie

Hašovacie funkcie ponúkané libsodium umožňujú jednoduché hašovanie, t. J. Rovnaký vstup vedie k rovnakému výstupu, alebo kombinácia s heslom pre scenár HMAC. Použitý algoritmus je (od októbra 2017) BLAKE2b jedným z finalistov SHA-3.

heslo

O tom sme písali v našom článku o bezpečnom ukladaní hesiel. Našťastie libsodium už poskytuje príslušné funkcie na bezpečné ukladanie hesiel. V štandardnej implementácii aktuálna verzia libsodium používa Argon2.

výhľad

Tejto kritickej otázke sa budeme podrobnejšie venovať v priebehu najbližších týždňov. Cieľom je, aby ste sa naučili, ako najlepšie využívať libsodium, a aby ste mohli do svojej aplikácie skutočne integrovať bezpečné šifrovanie. Ak je to trochu akútnejšie, môžeme vám samozrejme poradiť aj priamo. Tešíme sa tiež na vašu spätnú väzbu!