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 utilizzare un oggetto per proteggere la password di un utente da usare SecureString 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 SecureString per il 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 l'archiviazione di stringhe potenzialmente sensibili nella memoria di elaborazione come testo normale. Per le limitazioni, tuttavia, vedere la sezione Proteggere SecureString? . Il valore di un'istanza di viene protetto automaticamente tramite un meccanismo supportato dalla piattaforma sottostante quando l'istanza viene inizializzata SecureString o quando il valore viene modificato. L'applicazione può rendere l'istanza non modificabile e impedire ulteriori modifiche richiamando il MakeReadOnly metodo .

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

Importante

Il tipo implementa l'interfaccia IDisposable. Dopo aver terminato di usare 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:

Confronto tra stringa e SecureString
Operazioni SecureString
SecureString e interoperabilità
Quanto è sicuro SecureString?

Confronto tra stringa e SecureString

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

Un SecureString oggetto è simile a un oggetto in quanto ha un valore di String testo. Tuttavia, il valore di un oggetto è bloccato 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 dall'applicazione che chiama il metodo o dal Garbage Collector SecureString Dispose di .NET Framework.

Per una descrizione delle limitazioni della classe , vedere la sezione Proteggere SecureString 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
Per creare SecureString un'istanza di un oggetto, chiamare 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 metodo o AppendChar InsertAt .

Importante

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

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

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

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

Rilasciare la memoria allocata SecureString all'istanza
Poiché SecureString implementa IDisposable l'interfaccia , la memoria viene rilasciata chiamando il Dispose metodo .

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

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

Torna all'inizio

SecureString e interoperabilità

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

Ognuno di questi metodi crea una stringa non crittografata nella memoria non gestita. È responsabilità dello sviluppatore azzerare e liberare la memoria non appena non è più necessaria. Ogni metodo di conversione di stringhe e di allocazione di memoria ha un metodo corrispondente per azzerare e liberare la memoria allocata:

Metodo di allocazione e conversione Metodo zero e gratuito
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Torna all'inizio

Quanto è sicuro SecureString?

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

Anche se i dati archiviati in un'istanza sono più sicuri dei dati archiviati in un'istanza, esistono limitazioni significative sulla sicurezza di SecureString String SecureString un'istanza. Sono inclusi:

Piattaforma
Nel sistema Windows, il contenuto della matrice di caratteri SecureString interna di un'istanza 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, non crittografa lo spazio di archiviazione SecureString interno Windows piattaforma. In tali piattaforme vengono usate altre tecniche per fornire protezione aggiuntiva.

Duration
Anche se l'implementazione è in grado di sfruttare i vantaggi della crittografia, il testo normale assegnato all'istanza può SecureString essere esposto in diversi SecureString 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 poterlo usare.

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

  • Se la stringa sicura 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 valore dell'istanza viene semplicemente SecureString abbreviato rispetto alla String classe .

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

In generale, SecureString è più sicuro di perché limita String l'esposizione dei dati di 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. Invece di usare per proteggere le password, l'alternativa consigliata consiste nell'usare un handle opaco per le credenziali archiviate SecureString 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