Používať char pole cez reťazec na manipuláciu s heslami v Jave?

1. Prehľad

V tomto článku vysvetlíme, prečo by sme mali používať char [] pole na zastupovanie hesiel namiesto String v Jave.

Upozorňujeme, že tento výukový program sa zameriava na spôsoby manipulácie s heslami v pamäti, nie na skutočné spôsoby ich ukladania, ktoré sa zvyčajne spracúvajú vo vrstve vytrvalosti.

Tiež predpokladáme, že nemôžeme ovládať formát hesla (napr. Heslo pochádza z API tretej strany v podobe String). Aj keď by sa javilo zrejmé používať objekt typu java.lang.String na manipuláciu s heslami sa odporúča použiť samotný tím Java char [] namiesto toho.

Napríklad, ak sa pozrieme na JPasswordField z javax.swing, môžeme vidieť, že metóda getText () ktorý sa vracia String je od Java 2 zastaraný a je nahradený dostať heslo() metóda, ktorá sa vráti char [].

Poďme teda preskúmať niekoľko pádnych dôvodov, prečo je to tak.

2. Struny sú nemenné

Strings v Jave sú nemenné, čo znamená, že ich nemôžeme zmeniť pomocou žiadnych rozhraní API na vysokej úrovni. Akákoľvek zmena na a String objekt vyrobí nový String, pričom si ten starý drží v pamäti.

Preto heslo uložené v a String bude k dispozícii v pamäti, kým ho program Garbage Collector nevymaže. Nemôžeme kontrolovať, kedy sa to stane, ale toto obdobie môže byť podstatne dlhšie ako odvtedy pre bežné objekty Struny sú uchovávané v databáze reťazcov z dôvodu opätovnej použiteľnosti.

V dôsledku toho môže ktokoľvek s prístupom k výpisu pamäte získať heslo z pamäte.

S char [] pole namiesto String, po dokončení zamýšľanej práce môžeme údaje výslovne vymazať. Týmto spôsobom zabezpečíme, aby bolo heslo odstránené z pamäte ešte predtým, ako dôjde k zberu odpadu.

Poďme sa teraz pozrieť na útržky kódu, ktoré ukazujú, o čom sme práve hovorili.

Najprv pre String:

System.out.print ("Hodnota pôvodného hesla reťazca:"); System.out.println (stringPassword); System.out.println ("Originálne reťazcové heslo hashCode:" + Integer.toHexString (stringPassword.hashCode ())); Reťazec newString = "********"; stringPassword.replace (stringPassword, newString); System.out.print ("Reťazcová hodnota hesla po pokuse o jeho nahradenie:"); System.out.println (stringPassword); System.out.println ("hashCode po pokuse o nahradenie pôvodného reťazca:" + Integer.toHexString (stringPassword.hashCode ()));

Výstupom bude:

Hodnota pôvodného reťazca hesla: heslo Pôvodné heslo reťazca hashCode: 4889ba9b Hodnota reťazca po pokuse o nahradenie: heslo hashCode po pokuse o nahradenie pôvodného reťazca: 4889ba9b

Teraz pre char []:

char [] charPassword = nový char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.print ("Pôvodná hodnota hesla char:"); System.out.println (charPassword); System.out.println ("Originálne char heslo hashCode:" + Integer.toHexString (charPassword.hashCode ())); Arrays.fill (charPassword, '*'); System.out.print ("Zmenená hodnota hesla char:"); System.out.println (charPassword); System.out.println ("Zmenené char heslo hashCode:" + Integer.toHexString (charPassword.hashCode ()));

Výstup je:

Hodnota pôvodného znaku hesla: heslo Pôvodný znak hesla hash Kód: 7cc355be Zmenená hodnota hesla znaku: ******** Zmenená hodnota znaku hesla char: Kód: 7cc355be

Ako vidíme, potom, čo sme sa pokúsili nahradiť obsah originálu String, hodnota zostáva rovnaká a hashCode () metóda nevrátila inú hodnotu pri rovnakom spustení aplikácie, čo znamená, že pôvodná String zostal nedotknutý.

A pre char [] poľa sme boli schopní zmeniť údaje v rovnakom objekte.

3. Heslá môžeme náhodne vytlačiť

Ďalšia výhoda práce s heslami v systéme Windows char [] pole je zabránenie náhodnému prihláseniu hesla na konzolách, monitoroch alebo iných viac či menej bezpečných miestach.

Pozrime sa na ďalší kód:

Reťazec passwordString = "heslo"; char [] passwordArray = new char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.println ("Tlač hesla reťazca ->" + hesloString); System.out.println ("Tlač char [] heslo ->" + hesloArray);

S výstupom:

Tlač reťazca heslo -> heslo Tlač znaku [] heslo -> [[chránené e-mailom]

Vidíme, že samotný obsah je vytlačený v prvom prípade, zatiaľ čo v druhom prípade údaje nie sú také užitočné, čo robí char [] menej zraniteľné.

4. Záver

V tomto rýchlom článku sme zdôraznili niekoľko dôvodov, prečo by sme ich nemali používať Strings na zhromažďovanie hesiel a prečo by sme ich mali používať char [] polia namiesto toho.

Útržky kódu ako vždy nájdete na GitHub.


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