c4ba9249861584bba62e3166edacac2b
I Swing har password-feltet en `getPassword()`-metode (returnerer `char[]`) i stedet for den sædvanlige `getText()`-metode (returnerer `String`). På samme måde er jeg stødt på et forslag om ikke at bruge `String` til at håndtere passwords.


Hvorfor udgør `String` en trussel mod sikkerheden, når det drejer sig om adgangskoder?
Det føles besværligt at bruge `char[]`.


Hvorfor foretrækkes char[] frem for String til adgangskoder?
============================================================


answer-id.com
2021.43
**Strenge er uforanderlige**. Det betyder, at når du først har oprettet en `String`, kan du ikke slippe af med dataene, før [garbage collection](https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29) træder i kraft, hvis en anden proces kan dumpe hukommelsen (bortset fra [reflection](https://en.wikipedia.org/wiki/Reflection_%28computer_programming%29)).


Med et array kan du eksplicit slette dataene, når du er færdig med dem. Du kan overskrive arrayet med hvad som helst, og passwordet vil ikke være til stede nogen steder i systemet, selv før garbage collection.


Så ja, det *er* et sikkerhedsproblem - men selv ved at bruge `char[]` reduceres mulighederne for en angriber kun, og det er kun for denne specifikke type angreb.


Som nævnt i kommentarerne er det muligt, at arrays, der flyttes af garbage collector, efterlader vildfarne kopier af dataene i hukommelsen. Jeg tror, at dette er implementeringsspecifikt - garbage collector *kan* rydde al hukommelse, mens den går, for at undgå denne slags ting. Selv hvis den gør det, er der stadig den tid, hvor `char[]` indeholder de faktiske tegn som et angrebsvindue.


Karakterarrays (`char[]`) kan ryddes efter brug ved at sætte hvert tegn til nul, men ikke Strings. Hvis nogen på en eller anden måde kan se hukommelsesbilledet, kan de se en adgangskode i klartekst, hvis Strings anvendes, men hvis `char[]` anvendes, er adgangskoden sikker efter at data er renset med 0's.


Jeg tror ikke, at dette er et gyldigt forslag, men jeg kan i det mindste gætte på årsagen.


Jeg tror, at motivationen er, at man vil sikre sig, at man hurtigt og sikkert kan slette alle spor af adgangskoden i hukommelsen, efter at den er blevet brugt. Med en `char[]` kunne man med sikkerhed overskrive hvert element i arrayet med et tomt felt eller lignende. Du kan ikke redigere den interne værdi af en `String` på den måde.


Men det alene er ikke et godt svar; hvorfor ikke bare sørge for, at en reference til `char[]` eller `String` ikke undslipper? Så er der ikke noget sikkerhedsproblem. Men sagen er den, at `String`-objekter kan `intern()`ed i teorien og holdes i live inde i konstantpoolen. Jeg formoder, at brugen af `char[]` forbyder denne mulighed.

