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.


$config[zx-auto] not found$config[zx-overlay] not found