Használja a Char Array karakterláncot a jelszavak manipulálásához a Java-ban?

1. Áttekintés

Ebben a cikkben elmagyarázzuk, miért kell használnunk char [] tömb a jelszavak helyett Húr Java-ban.

Felhívjuk figyelmét, hogy ez az oktatóanyag a memóriában lévő jelszavak kezelésének módjaira összpontosít, nem pedig azok tárolásának tényleges módjaira, amelyeket általában a perzisztencia réteg kezel.

Azt is feltételezzük, hogy nem tudjuk ellenőrizni a jelszó formátumát (például a jelszó a harmadik fél API-jából származik a Húr). Bár nyilvánvalónak tűnik a típusú objektum használata java.lang.String a jelszavak manipulálásához azt a Java csapat javasolja használni char [] helyette.

Például, ha megnézzük a JPasswordField nak,-nek javax.hinta, láthatjuk, hogy a módszer getText () amely visszatér Húr a Java 2 óta elavult és helyette a getPassword () módszer, amely visszatér char [].

Tehát vizsgáljuk meg néhány erős okot, amiért ez a helyzet.

2. A húrok megváltoztathatatlanok

Húrs a Java-ban megváltoztathatatlanok, ami azt jelenti, hogy semmilyen magas szintű API-val nem tudjuk megváltoztatni őket. Bármilyen változás a Húr objektum új Húr, emlékezetben tartva a régit.

Ezért az a Húr mindaddig elérhető lesz a memóriában, amíg a Garbage Collector kitisztítja. Nem tudjuk ellenőrizni, hogy mikor történik, de ez az időszak lényegesen hosszabb lehet, mint a szokásos objektumok esetében Húrok egy String Poolban tárolják újrafelhasználhatóság céljából.

Következésképpen bárki, aki hozzáfér a memória kiíratásához, lekérheti a jelszót a memóriából.

Val,-vel char [] tömb a Húr, kifejezetten törölhetjük az adatokat, miután befejeztük a tervezett munkát. Így biztosítjuk a jelszó eltávolítását a memóriából még a szemétszállítás előtt.

Vessünk egy pillantást a kódrészletekre, amelyek bemutatják az imént tárgyaltakat.

Először a Húr:

System.out.print ("Eredeti karakterlánc jelszó értéke:"); System.out.println (stringPassword); System.out.println ("Eredeti karakterlánc-jelszó hashCode:" + Integer.toHexString (stringPassword.hashCode ())); String newString = "********"; stringPassword.replace (stringPassword, newString); System.out.print ("Karakterlánc jelszó értéke, miután megpróbálta cserélni:"); System.out.println (stringPassword); System.out.println ("hashCode az eredeti karakterlánc cseréje után:" + Integer.toHexString (stringPassword.hashCode ()));

A kimenet a következő lesz:

Eredeti karakterlánc jelszó értéke: jelszó Eredeti karakterlánc jelszó hashCode: 4889ba9b A karakterlánc értéke a helyettesítés után: jelszó hashCode az eredeti karakterlánc cseréje után: 4889ba9b

Most char []:

char [] charPassword = új char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.print ("Eredeti char jelszó értéke:"); System.out.println (charPassword); System.out.println ("Eredeti char jelszó hashCode:" + Integer.toHexString (charPassword.hashCode ())); Tömbök.kitöltés (charPassword, '*'); System.out.print ("Megváltozott char jelszó értéke:"); System.out.println (charPassword); System.out.println ("Megváltozott char jelszó hashCode:" + Integer.toHexString (charPassword.hashCode ()));

A kimenet:

Eredeti char jelszó értéke: jelszó Eredeti char jelszó hashCode: 7cc355be Megváltozott char jelszó értéke: ******** Megváltozott char jelszó hashCode: 7cc355be

Mint láthatjuk, miután megpróbáltuk kicserélni az eredeti tartalmát Húr, az érték ugyanaz marad és hash kód() metódus nem adott vissza más értéket az alkalmazás ugyanazon végrehajtásakor, vagyis az eredeti Húr sértetlen maradt.

És a char [] tömb, ugyanabban az objektumban tudtuk megváltoztatni az adatokat.

3. Véletlenül kinyomtathatjuk a jelszavakat

A jelszavakkal való munka további előnye a char [] A tömb a jelszó véletlen naplózásának megakadályozása konzolokon, monitorokon vagy más többé-kevésbé bizonytalan helyeken.

Nézzük meg a következő kódot:

String passwordString = "jelszó"; char [] passwordArray = új char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.println ("String jelszó nyomtatása ->" + passwordString); System.out.println ("char [] jelszó nyomtatása ->" + passwordArray);

A kimenettel:

String jelszó nyomtatása -> jelszó char [] jelszó nyomtatása -> [[email protected]

Látjuk, hogy az első esetben maga a tartalom van kinyomtatva, míg a második esetben az adatok nem annyira hasznosak, ami char [] kevésbé sebezhető.

4. Következtetés

Ebben a gyors cikkben több olyan okot is kiemeltünk, amelyek miatt nem szabad használni Húrs a jelszavak összegyűjtésére és miért használnánk char [] tömbök helyett.

Mint mindig, a kódrészletek is megtalálhatók a GitHubon.