Koristiti char niz preko niza za manipulaciju lozinkama u Javi?
1. Pregled
U ovom ćemo članku objasniti zašto bismo to trebali koristiti char [] niz za predstavljanje lozinki umjesto Niz na Javi.
Imajte na umu da se ovaj vodič usredotočuje na načine manipuliranja lozinkama u memoriji, a ne na stvarne načine njihovog pohranjivanja, koji se obično obrađuje u sloju postojanosti.
Također pretpostavljamo da ne možemo kontrolirati format lozinke (npr. Lozinka dolazi iz API-ja treće strane u obliku Niz). Iako bi se činilo očitim koristiti objekt tipa java.lang.String za manipulaciju lozinkama, Java tim preporučuje da ih koriste char [] umjesto toga.
Na primjer, ako pogledamo JPasswordField od javax.sving, možemo vidjeti da je metoda getText () koja se vraća Niz zastario je od Jave 2 i zamijenjen je s getPassword () metoda koja se vraća char [].
Dakle, istražimo nekoliko snažnih razloga zašto je to slučaj.
2. Žice su nepromjenjive
Nizs u Javi su nepromjenjivi, što znači da ih ne možemo mijenjati pomoću API-ja visoke razine. Svaka promjena na a Niz objekt proizvest će novi Niz, zadržavajući stari u sjećanju.
Stoga je lozinka pohranjena u a Niz bit će dostupan u memoriji dok ga Garbage Colleter ne očisti. Ne možemo kontrolirati kada se to dogodi, ali to razdoblje može biti znatno duže nego za uobičajene objekte od tada Žice čuvaju se u String Poolu radi ponovne upotrebljivosti.
Slijedom toga, svatko tko ima pristup izvatku memorije može dohvatiti lozinku iz memorije.
S char [] niz umjesto Niz, možemo izričito obrisati podatke nakon što završimo s planiranim poslom. Na ovaj način osigurat ćemo uklanjanje lozinke iz memorije čak i prije odvoženja smeća.
Pogledajmo sada isječke koda koji pokazuju ono o čemu smo upravo razgovarali.
Prvo za Niz:
System.out.print ("Vrijednost lozinke izvornog niza:"); System.out.println (stringPassword); System.out.println ("hashCode izvorne lozinke za niz:" + Integer.toHexString (stringPassword.hashCode ())); String newString = "********"; stringPassword.replace (stringPassword, newString); System.out.print ("String vrijednosti lozinke nakon pokušaja zamjene:"); System.out.println (stringPassword); System.out.println ("hashCode nakon pokušaja zamjene izvornog niza:" + Integer.toHexString (stringPassword.hashCode ()));
Izlaz će biti:
Vrijednost lozinke izvornog niza: lozinka Izvorna lozinka niza hashCode: 4889ba9b Vrijednost niza nakon pokušaja zamjene: lozinka hashCode nakon pokušaja zamjene izvornog niza: 4889ba9b
Sada za char []:
char [] charPassword = novi char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.print ("Izvorna vrijednost lozinke za char:"); System.out.println (charPassword); System.out.println ("Original char lozinka hashCode:" + Integer.toHexString (charPassword.hashCode ())); Nizovi.fill (charPassword, '*'); System.out.print ("Promijenjena vrijednost lozinke za char:"); System.out.println (charPassword); System.out.println ("Promijenjena lozinka za znak hashCode:" + Integer.toHexString (charPassword.hashCode ()));
Izlaz je:
Izvorna vrijednost lozinke za char: lozinka Izvorna lozinka za char hashCode: 7cc355be Promijenjena vrijednost lozinke za char: ******** Promijenjena lozinka za char za hashCode: 7cc355be
Kao što vidimo, nakon što smo pokušali zamijeniti sadržaj originala Niz, vrijednost ostaje ista i hashCode () metoda nije vratila drugačiju vrijednost u istom izvršavanju aplikacije, što znači da je izvornik Niz ostao netaknut.
I za char [] polje, mogli smo promijeniti podatke u istom objektu.
3. Slučajno možemo ispisati lozinke
Još jedna prednost rada s lozinkama u char [] niz je sprečavanje slučajnog zapisivanja lozinke u konzole, monitore ili druga više ili manje nesigurna mjesta.
Provjerimo sljedeći kod:
String passwordString = "lozinka"; char [] passwordArray = new char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.println ("Lozinka za ispisni niz ->" + stringString); System.out.println ("Ispis char [] lozinka ->" + passwordArray);
S izlazom:
Lozinka za niz ispisa -> lozinka Zaporka za ispis char [] -> [[zaštićena e-poštom]
Vidimo da je sam sadržaj ispisan u prvom slučaju, dok u drugom slučaju podaci nisu toliko korisni, što čini char [] manje ranjiva.
4. Zaključak
U ovom kratkom članku naglasili smo nekoliko razloga zašto ih ne bismo trebali koristiti Nizs za prikupljanje lozinki i zašto bismo ih trebali koristiti char [] umjesto toga nizovi.
Kao i uvijek, isječke koda možete pronaći na GitHubu.