Gestione delle password nel wicket

0

Ho un modulo che contiene un campo password.

In swing il metodo getPassword () restituisce un array di caratteri. Dopo che la password è stata elaborata dalla mia applicazione Web, l'array può essere cancellato per rimuovere la password dalla memoria. Questo non è possibile quando si usano le stringhe perché le stringhe sono immutabili. L'utilizzo degli array riduce il rischio di attacchi alla divulgazione della memoria.

Come posso ottenere questo risultato, ad esempio non usare le stringhe per le password in Wicket?

Questa pagina ha un esempio con le stringhe.

    
posta DanielE 10.04.2014 - 12:08
fonte

1 risposta

1

In realtà non puoi davvero "rimuovere la password dalla memoria". Non al giorno d'oggi.

Nei vecchi tempi , le strategie di allocazione della memoria nelle macchine virtuali Java erano relativamente semplici; quando è stato assegnato un blocco, è stato assegnato una volta e rimasto in memoria, fino al GC ha deciso che non era più raggiungibile e quindi poteva essere rilasciato. In questa modalità, l'allocazione è simile a ciò che i programmatori C chiamano malloc() . Per questi JVM, il GC era conservativo : non sempre rilevava in modo affidabile se un dato pezzo di dati in memoria era un puntatore o qualcos'altro (ad esempio un intero o alcuni caratteri), e quindi supposto che tutto ciò che sembrava un puntatore dovesse essere trattato come tale, per scopi di raccolta dei dati inutili.

Poiché Java è un linguaggio tipizzato rigorosamente, ha permesso l'implementazione di GC più rigorosi che hanno una conoscenza approfondita di cosa sia un puntatore e cosa no. Ciò consente al GC di spostare oggetti nella memoria. Da parte tua, nel codice sorgente Java, questo è completamente trasparente. Ma internamente, il GC può decidere di spostare un oggetto da una postazione nella RAM a un'altra, correggendo automaticamente tutti i puntatori per puntare ora alla nuova copia dell'oggetto. Ciò consente molte ottimizzazioni che rendono questo tipo di GC piuttosto desiderabile (migliore coerenza della cache, allocazione molto veloce ...). Tutta la JVM dell'ultimo decennio utilizza algoritmi GC di questo tipo.

Tuttavia, una conseguenza di questi GC più recenti e migliorati è che le vecchie copie degli oggetti potrebbero rimanere nella RAM. Quando si "cancella" un char[] , si sta scrivendo solo sull'ultima copia in memoria dell'array; i resti di copie più vecchie potrebbero ancora essere lì e contenere la tua password, completamente fuori dalla tua portata poiché tutto ciò è fatto in modo trasparente, invisibile dallo sviluppatore.

Pertanto, la tradizione di memorizzare le password in char[] e pulirle è proprio questo: una tradizione. È usato per essere giustificato, in giorni dal secolo precedente, quando la JVM utilizzava un GC conservativo. A quel tempo, la pulizia funzionava e stava davvero rimuovendo i dati segreti dalla memoria. In questi giorni sono finiti. La pulizia guidata dal programmatore non funziona più. Quindi non ha senso fare una differenza tra char[] e String ; usa solo String e fallo con esso.

Se credi nell'importanza della cancellazione, allora il modo corretto per farlo è integrare la pulitura automatica all'interno del GC, applicata sistematicamente a tutti gli oggetti. Non so se l'attuale JVM di Oracle (o OpenJDK) offra un'opzione per questo.

    
risposta data 10.04.2014 - 15:58
fonte

Leggi altre domande sui tag