SecureString Classe

Definizione

Rappresenta il testo che deve rimanere riservato, ad esempio eliminandolo dalla memoria del computer quando non è più necessario.Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. Questa classe non può essere ereditata.This class cannot be inherited.

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

Esempi

Nell'esempio seguente viene illustrato come utilizzare un SecureString oggetto per proteggere la password di un utente da utilizzare come credenziale per avviare un nuovo processo.The following example demonstrates how to use a SecureString to secure a user's password for use as a credential to start a new process.

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 SecureString classe per nuove attività di sviluppo.We don't recommend that you use the SecureString class for new development. Per altre informazioni, vedere SecureString non deve essere usato in GitHub.For more information, see SecureString shouldn't be used on GitHub.

SecureStringè un tipo stringa che fornisce una misura di sicurezza.SecureString is a string type that provides a measure of security. Tenta di evitare di archiviare stringhe potenzialmente sensibili nella memoria del processo come testo normale.It tries to avoid storing potentially sensitive strings in process memory as plain text. Per le limitazioni, tuttavia, vedere la sezione How Secure is SecureString? . Il valore di un'istanza di SecureString viene protetto automaticamente utilizzando un meccanismo supportato dalla piattaforma sottostante quando l'istanza viene inizializzata o quando il valore viene modificato.(For limitations, however, see the How secure is SecureString? section.) The value of an instance of SecureString is automatically protected using a mechanism supported by the underlying platform when the instance is initialized or when the value is modified. L'applicazione può eseguire il rendering dell'istanza non modificabile e impedire ulteriori modifiche richiamando il MakeReadOnly metodo.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

La lunghezza massima di un' SecureString istanza è di 65.536 caratteri.The maximum length of a SecureString instance is 65,536 characters.

Importante

Il tipo implementa l'interfaccia IDisposable.This type implements the IDisposable interface. Al termine dell'utilizzo di un'istanza del tipo, è necessario eliminarla direttamente o indirettamente.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Per eliminare direttamente il tipo, chiamare il metodo Dispose in un blocco try/catch.To dispose of the type directly, call its Dispose method in a try/catch block. Per eliminarlo indirettamente, utilizzare un costrutto di linguaggio come ad esempio using in C# o Using in Visual Basic.To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Per altre informazioni, vedere la sezione "Uso di un oggetto che implementa IDisposable" nell'argomento relativo all'interfaccia IDisposable.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

La SecureString classe e i relativi membri non sono visibili a com.The SecureString class and its members are not visible to COM. Per ulteriori informazioni, vedere ComVisibleAttribute.For more information, see ComVisibleAttribute.

Contenuto della sezione:In this section:

Confronto tra stringa e SecureString String vs. SecureString
Operazioni SecureString SecureString operations
SecureString e interoperabilità SecureString and interop
Quanto è sicuro SecureString?How secure is SecureString?

Stringa rispetto a SecureStringString versus SecureString

Un'istanza della System.String classe non è modificabile e, quando non è più necessaria, non può essere pianificata a livello di programmazione per Garbage Collection, ovvero l'istanza è di sola lettura dopo la creazione e non è possibile prevedere quando l'istanza sarà eliminato dalla memoria del computer.An instance of the System.String class is both immutable and, when no longer needed, cannot be programmatically scheduled for garbage collection; that is, the instance is read-only after it is created, and it is not possible to predict when the instance will be deleted from computer memory. Poiché System.String le istanze non sono modificabili, le operazioni che sembrano modificare un'istanza esistente ne creano effettivamente una copia da modificare.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. Di conseguenza, se String un oggetto contiene informazioni riservate, ad esempio una password, un numero di carta di credito o dati personali, esiste il rischio che le informazioni vengano rivelate dopo l'utilizzo perché l'applicazione non è in grado di eliminare i dati dalla memoria del computer .Consequently, if a String object contains sensitive information such as a password, credit card number, or personal data, there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory.

Un SecureString oggetto è simile a un String oggetto in quanto contiene un valore di testo.A SecureString object is similar to a String object in that it has a text value. Tuttavia, il valore di un SecureString 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 Dispose metodo o dalla .NET Framework Garbage Collector.However, the value of a SecureString object is pinned in memory, may use a protection mechanism, such as encryption, provided by the underlying operating system, can be modified until your application marks it as read-only, and can be deleted from computer memory either by your application calling the Dispose method or by the .NET Framework garbage collector.

Per informazioni sulle limitazioni della SecureString classe, vedere la sezione How Secure is SecureString? .For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

Torna all'inizioBack to top

Operazioni SecureStringSecureString operations

La SecureString classe include i membri che consentono di eseguire le operazioni seguenti:The SecureString class includes members that allow you to do the following:

Creare un'istanza SecureString di un oggettoInstantiate a SecureString object
Si crea un'istanza SecureString di un oggetto chiamando il relativo costruttore senza parametri.You instantiate a SecureString object by calling its parameterless constructor.

Aggiungere caratteri a un SecureString oggettoAdd characters to a SecureString object
È possibile aggiungere un singolo carattere alla volta a un SecureString oggetto chiamando il relativo AppendChar metodo o InsertAt .You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

Importante

Un SecureString oggetto non deve mai essere costruito da Stringun, perché i dati sensibili sono già soggetti alle conseguenze della persistenza della memoria della String classe non modificabile.A SecureString object should never be constructed from a String, because the sensitive data is already subject to the memory persistence consequences of the immutable String class. Il modo migliore per costruire un SecureString oggetto è costituito da un'origine non gestita carattere per volta, ad esempio il Console.ReadKey metodo.The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

Rimuovere i caratteri da SecureString un oggettoRemove characters from a SecureString object
È possibile sostituire un singolo SetAt carattere chiamando il metodo, rimuovere un singolo carattere chiamando il RemoveAt metodo oppure SecureString rimuovere tutti i caratteri dall'istanza chiamando il Clear metodo.You can replace an individual character by calling the SetAt method, remove an individual character by calling the RemoveAt method, or remove all characters from the SecureString instance by calling the Clear method.

Rendere l' SecureString oggetto di sola letturaMake the SecureString object read-only
Una volta definita la stringa rappresentata dall' SecureString oggetto, è possibile chiamare il MakeReadOnly relativo metodo per rendere la stringa di sola lettura.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

Ottenere informazioni sull' SecureString oggettoGet information about the SecureString object
La SecureString classe dispone solo di due membri che forniscono informazioni sulla stringa: la Length relativa 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.The SecureString class has only two members that provide information about the string: its Length property, which indicates the number of UTF16-encoded code units in the string; and the IsReadOnly, method, which indicates whether the instance is read-only.

Rilasciare la memoria allocata all' SecureString istanzaRelease the memory allocated to the SecureString instance
Poiché SecureString implementa l' IDisposable interfaccia, la relativa memoria viene rilasciata Dispose chiamando il metodo.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

La SecureString classe non dispone di membri che ispezionano, confrontano o convertono SecureStringil valore di un oggetto.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. L'assenza di tali membri contribuisce a proteggere il valore dell'istanza da un'esposizione accidentale o dannosa.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Usare i membri appropriati della System.Runtime.InteropServices.Marshal classe, ad esempio il SecureStringToBSTR metodo, per modificare il valore di un SecureString oggetto.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

La libreria di classi .NET Framework usa SecureString comunemente le istanze nei modi seguenti:The .NET Framework Class Library commonly uses SecureString instances in the following ways:

Torna all'inizioBack to top

SecureString e interoperabilitàSecureString and interop

Poiché il sistema operativo non supporta SecureStringdirettamente, è necessario convertire il valore SecureString dell'oggetto nel tipo di stringa richiesto prima di passare la stringa a un metodo nativo.Because the operating system does not directly support SecureString, you must convert the value of the SecureString object to the required string type before passing the string to a native method. La Marshal classe dispone di cinque metodi che eseguono questa operazione:The Marshal class has five methods that do this:

Ognuno di questi metodi crea una stringa di testo non crittografato nella memoria non gestita.Each of these methods creates a clear-text string in unmanaged memory. È responsabilità dello sviluppatore azzerare e liberare la memoria non appena non è più necessaria.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. Ogni metodo di conversione di stringa e di allocazione della memoria ha un metodo corrispondente per azzerare e liberare la memoria allocata:Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

Metodo di allocazione e conversioneAllocation and conversion method Zero e metodo FreeZero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

Torna all'inizioBack to top

Quanto è sicuro SecureString?How secure is SecureString?

Una volta creata correttamente, SecureString un'istanza di offre una maggiore protezione Stringdei dati rispetto a un.When created properly, a SecureString instance provides more data protection than a String. Quando si crea una stringa da un'origine carattere alla volta, String crea più intermedio in memoria, mentre SecureString crea solo una singola istanza.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. Garbage Collection di String oggetti è non deterministica.Garbage collection of String objects is non-deterministic. Inoltre, poiché la memoria non è bloccata, il Garbage Collector effettuerà copie aggiuntive dei valori String durante lo stato di trasferimento e compattazione della memoria.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. Al contrario, la memoria allocata a SecureString un oggetto viene bloccata e tale memoria può essere liberata chiamando il Dispose metodo.In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

Sebbene i dati archiviati in SecureString un'istanza di siano più protetti rispetto ai dati String archiviati in un'istanza di, esistono limitazioni significative SecureString sulla sicurezza di un'istanza di.Although data stored in a SecureString instance is more secure than data stored in a String instance, there are significant limitations on how secure a SecureString instance is. Sono inclusi:These include:

PiattaformaPlatform
Nel sistema operativo Windows, il contenuto della matrice di SecureString caratteri interna di un'istanza è crittografato.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. Tuttavia, a causa di API mancanti o problemi di gestione delle chiavi, la crittografia non è disponibile in tutte le piattaforme.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. A causa di questa dipendenza della SecureString piattaforma, non esegue la crittografia dell'archiviazione interna sulla piattaforma non Windows.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. In queste piattaforme vengono utilizzate altre tecniche per fornire protezione aggiuntiva.Other techniques are used on those platforms to provide additional protection.

DurataDuration
Anche se l' SecureString implementazione è in grado di sfruttare la crittografia, il testo normale assegnato SecureString all'istanza può essere esposto in diversi momenti:Even if the SecureString implementation is able to take advantage of encryption, the plain text assigned to the SecureString instance may be exposed at various times:

  • 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.Because Windows doesn't offer a secure string implementation at the operating system level, the .NET Framework still has to convert the secure string value to its plain text representation in order to use it.

  • 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 nuovamente.Whenever the value of the secure string is modified by methods such as AppendChar or RemoveAt, it must be decrypted (that is, converted back to plain text), modified, and then encrypted again.

  • Se la stringa protetta viene utilizzata in una chiamata di interoperabilità, deve essere convertita in una stringa ANSI, in una stringa Unicode o in una stringa binaria (BSTR).If the secure string is used in an interop call, it must be converted to an ANSI string, a Unicode string, or a binary string (BSTR). Per ulteriori informazioni, vedere la sezione SecureString e interoperabilità.For more information, see the SecureString and interop section.

L'intervallo di tempo per cui SecureString il valore dell'istanza è esposto viene semplicemente abbreviato rispetto String alla classe.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Archiviazione rispetto all'utilizzoStorage versus usage
Più in generale, SecureString la classe definisce un meccanismo di archiviazione per i valori stringa che devono essere protetti o mantenuti riservati.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. Tuttavia, al di fuori dell'.NET Framework stesso, non è supportato SecureStringalcun meccanismo di utilizzo.However, outside of the .NET Framework itself, no usage mechanism supports 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 relativa destinazione e che la decrittografia e la conversione devono essere eseguite nello spazio utente.This means that the secure string must be converted to a usable form (typically a clear text form) that can be recognized by its target, and that decryption and conversion must occur in user space.

Nel complesso SecureString , è più sicuro String rispetto a perché limita l'esposizione di dati di stringa sensibili.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. 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.However, those strings may still be exposed to any process or operation that has access to raw memory, such as a malicious process running on the host computer, a process dump, or a user-viewable swap file. Anziché utilizzare per proteggere le password, l'alternativa consigliata consiste nell'utilizzare un handle opaco per le credenziali archiviate al di fuori del processo. SecureStringInstead of using SecureString to protect passwords, the recommended alternative is to use an opaque handle to credentials that are stored outside of the process.

Torna all'inizioBack to top

Costruttori

SecureString()

Inizializza una nuova istanza della classe SecureString.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32)

Inizializza una nuova istanza della classe SecureString da una sottomatrice di oggetti Char.Initializes a new instance of the SecureString class from a subarray of Char objects.

Questo costruttore non è conforme a CLS.This constructor is not CLS-compliant. L'alternativa conforme a CLS è SecureString().The CLS-compliant alternative is SecureString().

Proprietà

Length

Ottiene il numero di caratteri nella stringa protetta corrente.Gets the number of characters in the current secure string.

Metodi

AppendChar(Char)

Aggiunge un carattere alla fine della stringa protetta corrente.Appends a character to the end of the current secure string.

Clear()

Elimina il valore della stringa protetta corrente.Deletes the value of the current secure string.

Copy()

Crea una copia della stringa protetta corrente.Creates a copy of the current secure string.

Dispose()

Rilascia tutte le risorse usate dall'oggetto SecureString corrente.Releases all resources used by the current SecureString object.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.Determines whether the specified object is equal to the current object.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.Serves as the default hash function.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.Gets the Type of the current instance.

(Ereditato da Object)
InsertAt(Int32, Char)

Inserisce un carattere in questa stringa protetta nella posizione di indice specificata.Inserts a character in this secure string at the specified index position.

IsReadOnly()

Indica se questa stringa protetta è contrassegnata come di sola lettura.Indicates whether this secure string is marked read-only.

MakeReadOnly()

Rende il valore di testo di questa stringa protetta di sola lettura.Makes the text value of this secure string read-only.

MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

(Ereditato da Object)
RemoveAt(Int32)

Rimuove il carattere nella posizione di indice specificata da questa stringa protetta.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char)

Sostituisce il carattere esistente nella posizione di indice specificata con un altro carattere.Replaces the existing character at the specified index position with another character.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

(Ereditato da Object)

Si applica a

Vedi anche