Sentiti libero di correggermi se i miei presupposti sono sbagliati qui, ma lasciami spiegare perché lo sto chiedendo.
Tratto da MSDN, a SecureString
:
Rappresenta il testo che deve essere mantenuto riservato. Il testo viene crittografato per motivi di privacy quando viene utilizzato ed eliminato dalla memoria del computer quando non è più necessario.
Capisco, ha perfettamente senso archiviare una password o altre informazioni private in un SecureString
over a System.String
, perché è possibile controllare come e quando è effettivamente archiviato in memoria, perché a System.String
:
è sia immutabile che, quando non è più necessario, non può essere programmato programmaticamente per la garbage collection; vale a dire, l'istanza è di sola lettura dopo che è stata creata e non è possibile prevedere quando l'istanza verrà eliminata dalla memoria del computer. Di conseguenza, se un oggetto String contiene informazioni riservate come una password, un numero di carta di credito o dati personali, esiste il rischio che le informazioni possano essere rivelate dopo essere state utilizzate poiché l'applicazione non può eliminare i dati dalla memoria del computer.
Tuttavia, nel caso di un'applicazione GUI (ad esempio un client ssh), SecureString
deve essere creato da a System.String
. Tutti i controlli di testo utilizzano una stringa come tipo di dati sottostante .
Quindi, questo significa che ogni volta che l'utente preme un tasto, la vecchia stringa presente viene scartata e viene creata una nuova stringa per rappresentare il valore all'interno della casella di testo, anche se si utilizza una maschera password. E non possiamo controllare quando o se qualcuno di questi valori viene scartato dalla memoria .
Ora è il momento di accedere al server. Indovina un po? È necessario passare una stringa sulla connessione per l'autenticazione . Quindi convertiamo il nostro SecureString
in un System.String
.... e ora abbiamo una stringa nell'heap senza alcun modo per forzarla a passare attraverso la garbage collection (o scrivere 0 nel suo buffer).
Il mio punto è : non importa quello che fai, da qualche parte lungo la linea, che SecureString
sta andando a essere convertito in una System.String
, il che significa che sarà almeno esistere sul mucchio ad un certo punto (senza alcuna garanzia di raccolta dei rifiuti).
Il mio punto non è : se ci sono modi per aggirare l'invio di una stringa a una connessione ssh o per evitare che un controllo memorizzi una stringa (crea un controllo personalizzato). Per questa domanda, puoi sostituire "connessione ssh" con "modulo di accesso", "modulo di registrazione", "modulo di pagamento", "alimenti-che-alimenteresti-il-tuo-cucciolo-ma-non-i-tuoi-figli", eccetera.
- Quindi, a che punto l'utilizzo di un
SecureString
diventa effettivamente pratico? - Vale sempre la pena il tempo di sviluppo aggiuntivo per sradicare completamente l'uso di un
System.String
oggetto? - Il punto è
SecureString
semplicemente quello di ridurre la quantità di tempo a disposizioneSystem.String
dell'heap (riducendo il rischio di passare a un file di scambio fisico)? - Se un attaccante ha già i mezzi per un'ispezione dell'heap, molto probabilmente (A) ha già i mezzi per leggere le sequenze di tasti, oppure (B) ha già fisicamente la macchina ... Quindi usare un
SecureString
impedirgli di raggiungere il dati comunque? - È solo "sicurezza attraverso l'oscurità"?
Scusate se sto ponendo le domande troppo fitte, la curiosità ha appena avuto la meglio su di me. Sentiti libero di rispondere a una o tutte le mie domande (o dimmi che i miei presupposti sono completamente sbagliati). :)
SecureString
non è davvero una stringa sicura. È semplicemente un modo per ridurre la finestra temporale in cui qualcuno può ispezionare la tua memoria e ottenere con successo i dati sensibili. Questo non è a prova di proiettile e non doveva essere. Ma i punti che stai sollevando sono molto validi. Correlati: stackoverflow.com/questions/14449579/…