Stai confondendo due problemi leggermente ortogonali qui con la dicitura "confronta le password hash"
Memorizzazione della password (prima dell'hashing)
Come dice Jon Skeet su SO:
Strings are immutable (in Java and many other GC languages). That means once you've created the String, if another process can dump memory, there's no way (aside from reflection) you can get rid of the data before garbage collection kicks in.
Se si sta gestendo la password di un utente, si vuole evitare questo rischio, quindi, si utilizza un tipo di dati che è possibile sovrascrivere immediatamente dopo averlo utilizzato: una serie di byte si adatta perfettamente alla fattura. Una volta applicato l'algoritmo di hash della password, puoi riempire l'array (o utilizzare dati casuali o qualsiasi altra cosa).
Confronto degli hash (ad es. dopo l'hashing, prima di accedere)
Le funzioni hash producono byte. È come sono definiti e in genere come funzionano nella maggior parte dei linguaggi di programmazione, quindi ha più senso semplicemente confrontare i due bytestrings così come sono, senza prima eseguirli attraverso qualsiasi convertitore.
Tuttavia, se l'hash della password è codificato in base64 nel database, non vi è alcuna perdita di sicurezza dal prendere l'hash della password calcolata e codificarlo in base64 e quindi confrontare le stringhe. L'hash è già nel tuo database - se un utente malintenzionato ha accesso al tuo sistema sufficiente a scaricare la memoria del processo, non dovrebbe essere troppo lungo per recuperare l'hash della password dal tuo database - non importa se lo pescano da lì o da una copia immutabile conservata fino a quando il tuo GC è in esecuzione.
Riepilogo
Quindi, per semplificare le cose:
- Elabora le password utente come array di byte, non utilizzando tipi di stringhe.
- Process hash anche come stringhe di byte, poiché non vi è alcun vantaggio nel convertirli solo per il confronto.
- Utilizza uno schema di hashing della password sicura. Argon2 se disponibile è attualmente raccomandato, altrimenti segui il consiglio qui: link