Uvod u Jasypt
1. Pregled
U ovom ćemo članku pogledati Jasypt (Java pojednostavljeno šifriranje) knjižnica.
Jasypt je Java knjižnica koja programerima omogućuje dodavanje osnovnih mogućnosti šifriranja projektima uz minimalan napor i bez potrebe za detaljnim znanjem o detaljima implementacije protokola šifriranja.
2. Korištenje jednostavnog šifriranja
Uzmimo u obzir da gradimo web aplikaciju u kojoj korisnik šalje račun privatnim podacima. Te podatke moramo pohraniti u bazu podataka, ali bilo bi nesigurno pohranjivanje običnog teksta.
Jedan od načina rješavanja toga je pohranjivanje šifriranih podataka u bazu podataka, a prilikom dohvaćanja tih podataka za određenog korisnika dešifrira ih.
Da bismo izvršili šifriranje i dešifriranje pomoću vrlo jednostavnog algoritma, možemo koristiti BasicTextEncryptor razred iz Jasypt knjižnice:
BasicTextEncryptor textEncryptor = novi BasicTextEncryptor (); Niz privateData = "secret-data"; textEncryptor.setPasswordCharArray ("neki-slučajni-podaci" .toCharArray ());
Tada možemo koristiti šifriranje () metoda za šifriranje običnog teksta:
Niz myEncryptedText = textEncryptor.encrypt (privateData); assertNotSame (privateData, myEncryptedText);
Ako želimo pohraniti privatne podatke za datog korisnika u bazu podataka, možemo pohraniti myEncryptedText bez kršenja bilo kakvih sigurnosnih ograničenja. Ako želimo dešifrirati podatke natrag u običan tekst, možemo koristiti a dešifriraj () metoda:
Niz plainText = textEncryptor.decrypt (myEncryptedText); assertEquals (plainText, privateData);
Vidimo da su dešifrirani podaci jednaki podacima u običnom tekstu koji su prethodno bili šifrirani.
3. Jednosmjerno šifriranje
Prethodni primjer nije idealan način za provjeru autentičnosti, odnosno kada želimo pohraniti korisničku lozinku. U idealnom slučaju, želimo šifrirati lozinku bez načina da je dešifriramo. Kad se korisnik pokuša prijaviti u našu uslugu, mi šifriramo njegovu lozinku i uspoređujemo je s šifriranom lozinkom koja je pohranjena u bazi podataka. Na taj način ne trebamo raditi s lozinkom za običan tekst.
Možemo koristiti a BasicPasswordEncryptor klase za izvođenje jednosmjerne enkripcije:
Lozinka niza = "secret-pass"; BasicPasswordEncryptor passwordEncryptor = novi BasicPasswordEncryptor (); Niz encryptedPassword = passwordEncryptor.encryptPassword (lozinka);
Zatim možemo usporediti već šifriranu lozinku s lozinkom korisnika koji izvršava postupak prijave bez potrebe za dešifriranjem lozinke koja je već pohranjena u bazi podataka:
boolean rezultat = passwordEncryptor.checkPassword ("secret-pass", encryptedPassword); assertTrue (rezultat);
4. Konfiguriranje algoritma za šifriranje
Možemo koristiti jači algoritam šifriranja, ali moramo imati na umu da za naš JVM instaliramo datoteke s pravilima o nadležnosti za neograničenu snagu Java Cryptography Extension (JCE) (upute za instalaciju nalaze se u preuzimanju).
U Jasyptu možemo koristiti snažnu enkripciju pomoću a StandardPBEStringEncryptor razreda i prilagodite ga pomoću a setAlgoritam () metoda:
StandardPBEStringEncryptor encryptor = novi StandardPBEStringEncryptor (); Niz privateData = "secret-data"; encryptor.setPassword ("some-random-passwprd"); encryptor.setAlgorithm ("PBEWithMD5AndTripleDES");
Postavimo algoritam šifriranja na PBEWithMD5AndTripleDES.
Dalje, postupak šifriranja i dešifriranja izgleda isto kao i prethodni pomoću a BasicTextEncryptor razred:
Niz encryptedText = encryptor.encrypt (privateData); assertNotSame (privateData, encryptedText); Niz plainText = encryptor.decrypt (encryptedText); assertEquals (plainText, privateData);
5. Korištenje višenitnog dešifriranja
Kada radimo na višejezgrenom stroju, želimo paralelno obrađivati obradu dešifriranja. Za postizanje dobrih performansi možemo koristiti a PooledPBEStringEncryptor i setPoolSize () API za stvaranje bazena digestora. Svaki od njih može paralelno koristiti različita nit:
PooledPBEStringEncryptor encryptor = novi PooledPBEStringEncryptor (); encryptor.setPoolSize (4); encryptor.setPassword ("neki-slučajni-podaci"); encryptor.setAlgorithm ("PBEWithMD5AndTripleDES");
Dobra je praksa postaviti veličinu bazena jednakom broju jezgri stroja. Kôd za šifriranje i dešifriranje isti je kao i prethodni.
6. Korištenje u drugim okvirima
Brza završna napomena je da Jasypt Knjižnica se može integrirati s puno drugih knjižnica, uključujući naravno Proljeće Okvir.
Moramo samo stvoriti konfiguraciju za dodavanje podrške za šifriranje u našu aplikaciju Spring. A ako želimo pohraniti osjetljive podatke u bazu podataka i koristimo ih Hibernate kao okvir za pristup podacima, također se možemo integrirati Jasypt s tim.
Upute o tim integracijama, kao i s nekim drugim okvirima, mogu se naći u Vodiči odjeljak na Jasyptovoj početnoj stranici.
7. Zaključak
U ovom smo članku gledali Jasypt knjižnica koja nam pomaže u stvaranju sigurnijih aplikacija pomoću već dobro poznatih i testiranih algoritama kriptografije. Prekriven je jednostavnim API-jem koji je jednostavan za upotrebu.
Provedbu svih ovih primjera i isječaka koda možete pronaći u projektu GitHub - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.