SecureString Classe

Definizione

Rappresenta il testo che deve rimanere riservato, ad esempio eliminandolo dalla memoria del computer quando non è più necessario. La classe non può essere ereditata.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Ereditarietà
SecureString
Implementazioni

Esempio

Nell'esempio seguente viene illustrato come usare un SecureString oggetto per proteggere la password di un utente da usare come credenziale per avviare un nuovo processo.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;

public class Example
{
    public static void Main()
    {
        // Instantiate the secure string.
        SecureString securePwd = new SecureString();
        ConsoleKeyInfo key;

        Console.Write("Enter password: ");
        do {
           key = Console.ReadKey(true);
           
           // Ignore any key out of range.
           if (((int) key.Key) >= 65 && ((int) key.Key <= 90)) {
              // Append the character to the password.
              securePwd.AppendChar(key.KeyChar);
              Console.Write("*");
           }   
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        Console.WriteLine();
        
        try {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        }
        catch (Win32Exception e) {
            Console.WriteLine(e.Message);
        }
        finally {
           securePwd.Dispose();
        }
    }
}
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security

Public Class Example
    Public Shared Sub Main()
        ' Instantiate the secure string.
        Dim securePwd As New SecureString()
        Dim key As ConsoleKeyInfo
        
        Console.Write("Enter password: ")
        Do
           key = Console.ReadKey(True)

           ' Ignore any key out of range
           If CInt(key.Key) >= 65 And CInt(key.Key <= 90) Then    
              ' Append the character to the password.
              securePwd.AppendChar(key.KeyChar)
              Console.Write("*")
           End If                                    
        ' Exit if Enter key is pressed.
        Loop While key.Key <> ConsoleKey.Enter
        Console.WriteLine()
        
        Try
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN")
        Catch e As Win32Exception
            Console.WriteLine(e.Message)
        Finally
           securePwd.Dispose()
        End Try
    End Sub
End Class

Commenti

Importante

Non è consigliabile usare la classe per il SecureString nuovo sviluppo. Per altre informazioni, vedere SecureString non deve essere usato in GitHub.

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 la sezione How secure is SecureString? (Come proteggere SecureString? ). 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 altre informazioni, vedere ComVisibleAttribute.

Contenuto della sezione:

String e SecureString
Operazioni SecureString
SecureString e interoperabilità
Qual è la sicurezza di SecureString?

String e SecureString

Un'istanza della System.String classe non è modificabile e, quando non è più necessaria, non può essere pianificata a livello di codice 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 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 Framework.

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

Torna all'inizio

Operazioni SecureString

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

Creare un'istanza di un SecureString oggetto
È possibile 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 chiamando il relativo 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 di tipo carattere alla volta, 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 oppure rimuovendo tutti i caratteri dall'istanza SecureString chiamando il Clear metodo .

Rendere 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
Poiché SecureString implementa l'interfaccia IDisposable , la memoria viene rilasciata chiamando il Dispose metodo .

La SecureString classe non ha membri che controllano, confrontano o converteno 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 Framework usa SecureString in genere le istanze nei modi seguenti:

Torna all'inizio

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 della 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

Torna all'inizio

Qual è la sicurezza di 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 carattere alla volta, String crea più intermedi in memoria, mentre SecureString crea una sola istanza. La Garbage Collection degli String oggetti non è deterministica. Inoltre, poiché la memoria non è bloccata, il Garbage Collector creerà copie aggiuntive di String valori durante lo spostamento e la compattazione della memoria. Al contrario, la memoria allocata a un SecureString oggetto viene bloccata e tale memoria può essere liberata chiamando il Dispose metodo .

Sebbene i dati archiviati in un'istanza SecureString siano più sicuri rispetto ai dati archiviati in un'istanza String di , esistono limitazioni significative sulla sicurezza di un'istanza SecureString . Sono inclusi:

Piattaforma
Nel sistema operativo Windows il contenuto della matrice di caratteri interna di un'istanza SecureString viene crittografato. Tuttavia, indipendentemente dal fatto che 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 nella piattaforma non Windows. Altre tecniche vengono usate su tali piattaforme per garantire una protezione aggiuntiva.

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

  • Poiché Windows non offre un'implementazione di stringa sicura a livello di sistema operativo, il .NET Framework deve comunque convertire il valore della stringa sicura nella relativa rappresentazione in 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
Più in generale, la SecureString classe definisce un meccanismo di archiviazione per i valori stringa che devono essere protetti o mantenuti riservati. Tuttavia, al di fuori del .NET Framework stesso, nessun meccanismo di utilizzo supporta SecureString. Ciò significa che la stringa protetta 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.

Complessivamente, SecureString è più sicuro rispetto String al fatto che limita l'esposizione di dati stringa sensibili. Tuttavia, tali stringhe possono comunque essere esposte a qualsiasi processo o operazione con 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.

Torna all'inizio

Costruttori

SecureString()

Inizializza una nuova istanza della classe SecureString.

SecureString(Char*, Int32)

Inizializza una nuova istanza della classe SecureString da una sottomatrice di oggetti Char.

Questo costruttore non è conforme a CLS. L'alternativa conforme a CLS è SecureString().

Proprietà

Length

Ottiene il numero di caratteri nella stringa protetta corrente.

Metodi

AppendChar(Char)

Aggiunge un carattere alla fine della stringa protetta corrente.

Clear()

Elimina il valore della stringa protetta corrente.

Copy()

Crea una copia della stringa protetta corrente.

Dispose()

Rilascia tutte le risorse usate dall'oggetto SecureString corrente.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
InsertAt(Int32, Char)

Inserisce un carattere in questa stringa protetta nella posizione di indice specificata.

IsReadOnly()

Indica se questa stringa protetta è contrassegnata come di sola lettura.

MakeReadOnly()

Rende il valore di testo di questa stringa protetta di sola lettura.

MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
RemoveAt(Int32)

Rimuove il carattere nella posizione di indice specificata da questa stringa protetta.

SetAt(Int32, Char)

Sostituisce il carattere esistente nella posizione di indice specificata con un altro carattere.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a

Vedi anche