Brug char Array Over a String til at manipulere adgangskoder i Java?

1. Oversigt

I denne artikel forklarer vi, hvorfor vi skal bruge char [] array til at repræsentere adgangskoder i stedet for Snor i Java.

Bemærk, at denne vejledning fokuserer på måderne til at manipulere adgangskoder i hukommelsen, ikke på de faktiske måder at gemme dem på, som normalt håndteres i persistenslaget.

Vi antager også, at vi ikke kan kontrollere formatet på adgangskoden (f.eks. Kommer adgangskoden fra tredjeparts-API'en i form af Snor). Selvom det synes åbenlyst at bruge objekt af typen java.lang.Streng til manipulation af adgangskoder anbefales det af Java-teamet selv at bruge char [] i stedet.

For eksempel, hvis vi kigger på JPasswordField af javax.swing, kan vi se, at metoden getText () der vender tilbage Snor er udfaset siden Java 2 og erstattes af getPassword () metode, der vender tilbage char [].

Så lad os undersøge et par stærke grunde til, at det er tilfældet.

2. Strenge er uforanderlige

Snors i Java er uforanderlige, hvilket betyder, at vi ikke kan ændre dem ved hjælp af API'er på højt niveau. Enhver ændring på en Snor objekt vil producere et nyt Snor, holder den gamle i hukommelsen.

Derfor er adgangskoden gemt i en Snor vil være tilgængelig i hukommelsen, indtil Garbage Collector rydder det. Vi kan ikke kontrollere, hvornår det sker, men denne periode kan være betydeligt længere end for almindelige objekter siden Strenge opbevares i en strengpool med henblik på genbrugelighed.

Derfor kan enhver med adgang til hukommelsesdumpen hente adgangskoden fra hukommelsen.

Med en char [] array i stedet for Snor, kan vi eksplicit slette data, når vi er færdige med tilsigtet arbejde. På denne måde sikrer vi, at adgangskoden fjernes fra hukommelsen, selv før skraldopsamling finder sted.

Lad os nu se på kodestykker, der viser, hvad vi lige har diskuteret.

Først til Snor:

System.out.print ("Original strengadgangskode værdi:"); System.out.println (stringPassword); System.out.println ("Original strengadgangskode hashCode:" + Heltal.tilHexString (stringPassword.hashCode ())); String newString = "********"; stringPassword.replace (stringPassword, newString); System.out.print ("Strengadgangskode værdi efter at have forsøgt at erstatte den:"); System.out.println (stringPassword); System.out.println ("hashCode efter at have forsøgt at erstatte den originale streng:" + Integer.toHexString (stringPassword.hashCode ()));

Outputtet vil være:

Værdi for oprindelig strengadgangskode: adgangskode Oprindelig strengadgangskode hashCode: 4889ba9b Strengværdi efter forsøg på at erstatte den: password hashCode efter forsøg på at erstatte den originale streng: 4889ba9b

Nu til char []:

char [] charPassword = ny char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.print ("Original char password value:"); System.out.println (charPassword); System.out.println ("Original char password hashCode:" + Integer.toHexString (charPassword.hashCode ())); Arrays.fill (charPassword, '*'); System.out.print ("Ændret værdi for char-adgangskode:"); System.out.println (charPassword); System.out.println ("Ændret char-kodeord hashCode:" + Heltal.tilHexString (charPassword.hashCode ()));

Outputtet er:

Original char adgangskode værdi: adgangskode Original char kodeord hashCode: 7cc355be Ændret char adgangskode værdi: ******** Ændret char kodeord hashKode: 7cc355be

Som vi kan se, efter at vi prøvede at erstatte indholdet af originalen Snor, forbliver værdien den samme og hashCode () metode returnerede ikke en anden værdi i den samme udførelse af applikationen, hvilket betyder, at originalen Snor forblev intakt.

Og til char [] array var vi i stand til at ændre dataene i det samme objekt.

3. Vi kan ved et uheld udskrive adgangskoder

En anden fordel ved at arbejde med adgangskoder i char [] array er forebyggelse af utilsigtet logning af adgangskoden i konsoller, skærme eller andre mere eller mindre usikre steder.

Lad os tjekke den næste kode:

String passwordString = "password"; char [] passwordArray = ny char [] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.println ("Udskrivning af strengadgangskode ->" + passwordString); System.out.println ("Udskrivning af char [] adgangskode ->" + passwordArray);

Med output:

Udskrivning af strengadgangskode -> adgangskode Udskrivning af char [] adgangskode -> [[e-mailbeskyttet]

Vi ser, at selve indholdet er trykt i det første tilfælde, mens i det andet tilfælde er dataene ikke så nyttige, hvilket gør char [] mindre sårbare.

4. Konklusion

I denne hurtige artikel understregede vi flere grunde til, at vi ikke skulle bruge Snors til indsamling af adgangskoder, og hvorfor vi skal bruge char [] arrays i stedet.

Som altid kan kodeuddrag findes på GitHub.


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