Classe System.Security.SecureString

Importante

È consigliabile non usare la classe per il nuovo sviluppo in .NET (Core) o quando si esegue la SecureString migrazione di codice esistente a .NET (Core). Per altre informazioni, vedere SecureString non deve essere usato.

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

SecureString è un tipo stringa che fornisce una misura di sicurezza. Tenta di evitare di archiviare stringhe potenzialmente sensibili nella memoria di elaborazione come testo normale. Per le limitazioni, tuttavia, vedere Quanto è sicuro SecureString? sezione.) Il valore di un'istanza di SecureString viene protetto automaticamente usando un meccanismo supportato dalla piattaforma sottostante quando l'istanza viene inizializzata o quando il valore viene modificato. L'applicazione può eseguire il rendering dell'istanza non modificabile e impedire ulteriori modifiche richiamando il MakeReadOnly metodo .

La lunghezza massima di un'istanza SecureString è di 65.536 caratteri.

Importante

Il tipo implementa l'interfaccia IDisposable. Al termine dell'uso di un'istanza del tipo, è necessario eliminarla direttamente o indirettamente. Per eliminare direttamente il tipo, chiamare il metodo Dispose in un blocco try/catch. Per eliminarlo indirettamente, utilizzare un costrutto di linguaggio come ad esempio using in C# o Using in Visual Basic. Per altre informazioni, vedere la sezione "Uso di un oggetto che implementa IDisposable" nell'argomento relativo all'interfaccia IDisposable.

La SecureString classe e i relativi membri non sono visibili a COM. Per ulteriori informazioni, vedere ComVisibleAttribute.

String e SecureString

Un'istanza della System.String classe non è modificabile e, quando non è più necessaria, non può essere pianificata a livello di programmazione per l'operazione di Garbage Collection, ovvero l'istanza è di sola lettura dopo la creazione e non è possibile prevedere quando l'istanza verrà eliminata dalla memoria del computer. Poiché System.String le istanze non sono modificabili, le operazioni che sembrano modificare un'istanza esistente creano effettivamente una copia di essa per modificarla. Di conseguenza, se un String oggetto contiene informazioni riservate, ad esempio una password, un numero di carta di credito o dati personali, è possibile che le informazioni vengano rivelate dopo l'uso perché l'applicazione non può eliminare i dati dalla memoria del computer.

Un SecureString oggetto è simile a un String oggetto in quanto ha un valore di testo. Tuttavia, il valore di un SecureString oggetto viene aggiunto in memoria, può usare un meccanismo di protezione, ad esempio la crittografia, fornito dal sistema operativo sottostante, può essere modificato fino a quando l'applicazione non lo contrassegna come di sola lettura e può essere eliminato dalla memoria del computer chiamando il Dispose metodo o dal Garbage Collector .NET.

Per una descrizione delle limitazioni della SecureString classe, vedere la sezione How secure is SecureString? (Come proteggere SecureString? ).

Operazioni SecureString

La SecureString classe include membri che consentono di eseguire le operazioni seguenti:

Creare un'istanza di un SecureString oggetto Creare un'istanza di un SecureString oggetto chiamando il relativo costruttore senza parametri.

Aggiungere caratteri a un SecureString oggetto È possibile aggiungere un singolo carattere alla volta a un SecureString oggetto chiamandone il AppendChar metodo o InsertAt .

Importante

Un SecureString oggetto non deve mai essere costruito da un Stringoggetto perché i dati sensibili sono già soggetti alle conseguenze della persistenza della memoria della classe non modificabile String . Il modo migliore per costruire un SecureString oggetto è da un'origine non gestita in fase di carattere, ad esempio il Console.ReadKey metodo .

Rimuovere caratteri da un SecureString oggetto È possibile sostituire un singolo carattere chiamando il SetAt metodo , rimuovendo un singolo carattere chiamando il RemoveAt metodo o rimuovendo tutti i caratteri dall'istanza SecureString chiamando il Clear metodo .

Impostare l'oggetto SecureString di sola lettura Dopo aver definito la stringa rappresentata dall'oggetto SecureString , chiamare il relativo MakeReadOnly metodo per rendere la stringa di sola lettura.

Ottenere informazioni sull'oggetto SecureString La SecureString classe ha solo due membri che forniscono informazioni sulla stringa: la relativa Length proprietà, che indica il numero di unità di codice con codifica UTF16 nella stringa e il IsReadOnlymetodo , che indica se l'istanza è di sola lettura.

Rilasciare la memoria allocata all'istanza SecureString Perché SecureString implementa l'interfaccia IDisposable , si rilascia la memoria chiamando il Dispose metodo .

La SecureString classe non dispone di membri che controllano, confrontano o convertano il valore di un oggetto SecureString. L'assenza di tali membri consente di proteggere il valore dell'istanza da esposizione accidentale o dannosa. Utilizzare i membri appropriati della System.Runtime.InteropServices.Marshal classe, ad esempio il SecureStringToBSTR metodo , per modificare il valore di un SecureString oggetto .

La libreria di classi .NET usa SecureString in genere le istanze nei modi seguenti:

SecureString e interoperabilità

Poiché il sistema operativo non supporta SecureStringdirettamente , è necessario convertire il valore dell'oggetto SecureString nel tipo stringa richiesto prima di passare la stringa a un metodo nativo. La Marshal classe ha cinque metodi che eseguono questa operazione:

Ognuno di questi metodi crea una stringa di testo non gestito nella memoria non gestita. È responsabilità dello sviluppatore zero e liberare tale memoria non appena non è più necessaria. Ognuno dei metodi di conversione di stringa e allocazione di memoria ha un metodo corrispondente a zero e liberare la memoria allocata:

Metodo di allocazione e conversione Zero e free, metodo
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Quanto è sicuro SecureString?

Quando viene creata correttamente, un'istanza SecureString fornisce una maggiore protezione dei dati rispetto a un oggetto String. Quando si crea una stringa da un'origine character-at-a-time, String crea più intermedi in memoria, mentre SecureString crea solo una singola istanza. La Garbage Collection degli String oggetti non è deterministica. Inoltre, poiché la memoria non è bloccata, il Garbage Collector eseguirà copie aggiuntive di valori durante lo spostamento e la compattazione della String memoria. Al contrario, la memoria allocata a un SecureString oggetto viene bloccata e tale memoria può essere liberata chiamando il Dispose metodo .

Anche se i dati archiviati in un'istanza SecureString sono più sicuri rispetto ai dati archiviati in un'istanza String di , esistono limitazioni significative sulla sicurezza di un'istanza SecureString . tra cui:

Piattaforma

Nel sistema operativo Windows il contenuto della matrice di caratteri interna di un'istanza SecureString viene crittografato. Tuttavia, a causa di API mancanti o problemi di gestione delle chiavi, la crittografia non è disponibile in tutte le piattaforme. A causa di questa dipendenza della piattaforma, SecureString non crittografa l'archiviazione interna in una piattaforma non Windows. Altre tecniche vengono usate su tali piattaforme per fornire una protezione aggiuntiva.

Durata

Anche se l'implementazione è in grado di sfruttare la SecureString crittografia, il testo normale assegnato all'istanza SecureString può essere esposto in diversi momenti:

  • Poiché Windows non offre un'implementazione di stringa sicura a livello di sistema operativo, .NET deve comunque convertire il valore della stringa sicura nella relativa rappresentazione di testo normale per usarlo.

  • Ogni volta che il valore della stringa protetta viene modificato da metodi come AppendChar o RemoveAt, deve essere decrittografato (ovvero, convertito di nuovo in testo normale), modificato e quindi crittografato di nuovo.

  • Se la stringa protetta viene usata in una chiamata di interoperabilità, deve essere convertita in una stringa ANSI, in una stringa Unicode o in una stringa binaria (BSTR). Per altre informazioni, vedere la sezione SecureString e interoperabilità .

L'intervallo di tempo per il quale viene esposto il SecureString valore dell'istanza è semplicemente abbreviato rispetto alla String classe .

Archiviazione rispetto all'utilizzo In genere, la SecureString classe definisce un meccanismo di archiviazione per i valori stringa che devono essere protetti o mantenuti riservati. Tuttavia, al di fuori di .NET stesso, nessun meccanismo di utilizzo supporta SecureString. Ciò significa che la stringa sicura deve essere convertita in un formato utilizzabile (in genere un formato di testo non crittografato) che può essere riconosciuto dalla destinazione e che la decrittografia e la conversione devono essere eseguite nello spazio utente.

In generale, SecureString è più sicuro rispetto String al fatto che limita l'esposizione dei dati stringa sensibili. Tuttavia, tali stringhe possono comunque essere esposte a qualsiasi processo o operazione che abbia accesso alla memoria non elaborata, ad esempio un processo dannoso in esecuzione nel computer host, un dump del processo o un file di scambio visualizzabile dall'utente. Anziché usare SecureString per proteggere le password, l'alternativa consigliata consiste nell'usare un handle opaco per le credenziali archiviate all'esterno del processo.