SecureString SecureString SecureString SecureString Class

Definición

Representa el texto que debe mantenerse confidencial (por ejemplo, mediante su eliminación de la memoria del equipo cuando ya no se necesite).Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. Esta clase no puede heredarse.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
Herencia
SecureStringSecureStringSecureStringSecureString
Implementaciones

Ejemplos

En el ejemplo siguiente se muestra cómo utilizar SecureString un para proteger la contraseña de un usuario para su uso como credencial para iniciar un nuevo proceso.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

Comentarios

Importante

No se recomienda usar la clase para SecureString el nuevo desarrollo.We don't recommend that you use the SecureString class for new development. Para obtener más información, consulte SecureString no debe usarse en github.For more information, see SecureString shouldn't be used on GitHub.

SecureStringes un tipo de cadena que proporciona una medida de seguridad.SecureString is a string type that provides a measure of security. Intenta evitar el almacenamiento de cadenas potencialmente confidenciales en la memoria de proceso como texto sin formato.It tries to avoid storing potentially sensitive strings in process memory as plain text. (Para conocer las limitaciones, consulte la sección ¿cómo se protege SecureString? ). El valor de una instancia de SecureString se protege automáticamente mediante un mecanismo compatible con la plataforma subyacente cuando se inicializa la instancia o cuando se modifica el valor.(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. La aplicación puede representar la instancia inmutable e impedir que se realicen más MakeReadOnly modificaciones mediante la invocación del método.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

La longitud máxima de una SecureString instancia es de 65.536 caracteres.The maximum length of a SecureString instance is 65,536 characters.

Importante

Este tipo implementa la interfaz IDisposable.This type implements the IDisposable interface. Cuando haya terminado de utilizar una instancia del tipo, debe desecharla directa o indirectamente.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Para eliminar el tipo directamente, llame a su método Dispose en un bloque try/catch.To dispose of the type directly, call its Dispose method in a try/catch block. Para deshacerse de él indirectamente, use una construcción de lenguaje como using (en C#) o Using (en Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Para más información, vea la sección "Uso de objetos que implementan IDisposable" en el tema de la interfaz IDisposable.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

La SecureString clase y sus miembros no son visibles para com.The SecureString class and its members are not visible to COM. Para obtener más información, vea ComVisibleAttribute.For more information, see ComVisibleAttribute.

En esta sección:In this section:

Cadena frente a SecureString String vs. SecureString
Operaciones SecureString SecureString operations
SecureString e Interop SecureString and interop
¿Qué grado de seguridad es SecureString?How secure is SecureString?

Cadena frente a SecureStringString versus SecureString

Una instancia de la System.String clase es inmutable y, cuando ya no se necesita, no se puede programar mediante programación para la recolección de elementos no utilizados; es decir, la instancia es de solo lectura una vez creada y no es posible predecir cuándo se eliminado de la memoria del equipo.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. Dado System.String que las instancias son inmutables, las operaciones que parecen modificar una instancia existente crean realmente una copia de ella para manipularlas.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. Por lo tanto, si String un objeto contiene información confidencial, como una contraseña, un número de tarjeta de crédito o datos personales, existe el riesgo de que la información se revele una vez utilizada porque la aplicación no puede eliminar los datos de la memoria del equipo. .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 objeto es similar a un String objeto en que tiene un valor de texto.A SecureString object is similar to a String object in that it has a text value. Sin embargo, el valor de SecureString un objeto se ancla en memoria, puede usar un mecanismo de protección, como el cifrado proporcionado por el sistema operativo subyacente, que se puede modificar hasta que la aplicación lo marca como de solo lectura y se puede eliminar de la memoria del equipo. ya sea por la aplicación que Dispose llama al método o al recolector de elementos no utilizados .NET Framework.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.

Para obtener una explicación de las limitaciones de SecureString la clase, consulte la sección how Secure is SecureString? .For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

Volver al principioBack to top

Operaciones SecureStringSecureString operations

La SecureString clase incluye miembros que le permiten hacer lo siguiente:The SecureString class includes members that allow you to do the following:

Crear una instancia SecureString de un objetoInstantiate a SecureString object
Puede crear una instancia SecureString de un objeto llamando a su constructor sin parámetros.You instantiate a SecureString object by calling its parameterless constructor.

Agregar caracteres a un SecureString objetoAdd characters to a SecureString object
Puede Agregar un solo carácter cada vez a un SecureString objeto llamando a su AppendChar método 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 objeto nunca debe construirse a partir Stringde un, ya que los datos confidenciales ya están sujetos a las consecuencias de la String persistencia de memoria de la clase inmutable.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. La mejor manera de construir un SecureString objeto es de un origen no administrado de carácter a uno, como el Console.ReadKey método.The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

Quitar caracteres de un SecureString objetoRemove characters from a SecureString object
Puede reemplazar un carácter SetAt individual llamando al método, quitar un carácter individual llamando al RemoveAt método o quitar todos los caracteres de la SecureString instancia llamando al Clear método.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.

Hacer que SecureString el objeto sea de solo lecturaMake the SecureString object read-only
Una vez que haya definido la cadena que SecureString representa el objeto, llame a MakeReadOnly su método para que la cadena sea de solo lectura.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

Obtener información sobre el SecureString objetoGet information about the SecureString object
La SecureString clase solo tiene dos miembros que proporcionan información sobre la cadena: su Length propiedad, que indica el número de unidades de código con codificación UTF16 de la cadena; y el IsReadOnlymétodo, que indica si la instancia es solo lectura.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.

Liberar la memoria asignada a SecureString la instanciaRelease the memory allocated to the SecureString instance
Dado SecureString que implementa la IDisposable interfaz, libera su memoria llamando al Dispose método.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

La SecureString clase no tiene ningún miembro que inspeccione, compare o convierta el valor SecureStringde un.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. La ausencia de estos miembros ayuda a proteger el valor de la instancia frente a exposiciones accidentales o malintencionadas.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Use los miembros adecuados de System.Runtime.InteropServices.Marshal la clase, como el SecureStringToBSTR método, para manipular el valor de un SecureString objeto.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

La biblioteca de clases de .NET Framework SecureString utiliza normalmente las instancias de de las siguientes maneras:The .NET Framework Class Library commonly uses SecureString instances in the following ways:

Volver al principioBack to top

SecureString e InteropSecureString and interop

Dado que el sistema operativo no admite SecureStringdirectamente, debe convertir el valor SecureString del objeto al tipo de cadena requerido antes de pasar la cadena a un método 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 clase tiene cinco métodos que hacen esto:The Marshal class has five methods that do this:

Cada uno de estos métodos crea una cadena de texto no cifrado en la memoria no administrada.Each of these methods creates a clear-text string in unmanaged memory. Es responsabilidad del desarrollador sacar el valor cero y liberar esa memoria en cuanto ya no se necesite.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. Cada uno de los métodos de conversión de cadena y de asignación de memoria tiene un método correspondiente a cero y libera la memoria asignada:Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

Método de asignación y conversiónAllocation and conversion method Zero y Free (método)Zero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

Volver al principioBack to top

¿Qué grado de seguridad es SecureString?How secure is SecureString?

Cuando se crea correctamente, SecureString una instancia Stringde proporciona más protección de datos que.When created properly, a SecureString instance provides more data protection than a String. Al crear una cadena a partir de un origen de carácter en la hora, String crea varios intermedios en la SecureString memoria, mientras que crea una sola instancia.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. La recolección de String elementos no utilizados de objetos no es determinista.Garbage collection of String objects is non-deterministic. Además, como la memoria no está anclada, el recolector de elementos no utilizados realizará copias adicionales de String los valores al mover y compactar la memoria.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. Por el contrario, la memoria asignada SecureString a un objeto está anclada y esa memoria se puede liberar llamando Dispose al método.In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

Aunque los datos almacenados en SecureString una instancia de son más seguros que los datos String almacenados en una instancia de, existen importantes limitaciones en SecureString cuanto a la seguridad de una instancia de.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. Se incluyen los siguientes:These include:

PlataformaPlatform
En el sistema operativo Windows, se cifra el contenido SecureString de la matriz de caracteres interna de una instancia.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. Sin embargo, ya que faltan API o problemas de administración de claves, el cifrado no está disponible en todas las plataformas.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. Debido a esta dependencia de la SecureString plataforma, no cifra el almacenamiento interno en la plataforma que no es de Windows.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. Se usan otras técnicas en esas plataformas para proporcionar protección adicional.Other techniques are used on those platforms to provide additional protection.

DuraciónDuration
Incluso si la SecureString implementación puede aprovechar el cifrado, el texto sin formato asignado a la SecureString instancia se puede exponer en varias ocasiones: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:

  • Dado que Windows no ofrece una implementación de cadena segura en el nivel de sistema operativo, el .NET Framework todavía tiene que convertir el valor de cadena segura en su representación de texto sin formato para poder usarlo.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.

  • Siempre que el valor de la cadena segura es modificado por métodos AppendChar como o RemoveAt, debe descifrarse (es decir, volver a convertirse en texto sin formato), modificarse y, a continuación, volver a cifrarse.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.

  • Si la cadena segura se usa en una llamada de interoperabilidad, debe convertirse en una cadena ANSI, una cadena Unicode o una cadena 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). Para obtener más información, vea la sección SecureString and Interop .For more information, see the SecureString and interop section.

El intervalo de tiempo para el SecureString que se expone el valor de la instancia se acorta simplemente en comparación String con la clase.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Almacenamiento frente al usoStorage versus usage
En general, la SecureString clase define un mecanismo de almacenamiento para los valores de cadena que deben protegerse o mantenerse confidenciales.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. Sin embargo, fuera del propio .NET Framework, no se admite SecureStringningún mecanismo de uso.However, outside of the .NET Framework itself, no usage mechanism supports SecureString. Esto significa que la cadena segura debe convertirse a un formato utilizable (normalmente un formato de texto no cifrado) que puede ser reconocido por su destino, y que el descifrado y la conversión deben aparecer en el espacio de usuario.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.

En general SecureString , es más seguro String que porque limita la exposición de datos de cadena confidenciales.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. Sin embargo, esas cadenas todavía se pueden exponer a cualquier proceso u operación que tenga acceso a la memoria sin procesar, como un proceso malintencionado que se ejecuta en el equipo host, un volcado de proceso o un archivo de intercambio visible para el usuario.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. En lugar de usar SecureString para proteger las contraseñas, la alternativa recomendada es usar un identificador opaco para las credenciales que se almacenan fuera del proceso.Instead of using SecureString to protect passwords, the recommended alternative is to use an opaque handle to credentials that are stored outside of the process.

Volver al principioBack to top

Constructores

SecureString() SecureString() SecureString() SecureString()

Inicializa una nueva instancia de la clase SecureString.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32)

Inicializa una nueva instancia de la clase SecureString desde una submatriz de objetos Char.Initializes a new instance of the SecureString class from a subarray of Char objects.

Este constructor no es conforme a CLS.This constructor is not CLS-compliant. La alternativa conforme a CLS es SecureString().The CLS-compliant alternative is SecureString().

Propiedades

Length Length Length Length

Obtiene el número de caracteres de la cadena segura actual.Gets the number of characters in the current secure string.

Métodos

AppendChar(Char) AppendChar(Char) AppendChar(Char) AppendChar(Char)

Anexa un carácter al final de la cadena segura actual.Appends a character to the end of the current secure string.

Clear() Clear() Clear() Clear()

Elimina el valor de la cadena segura actual.Deletes the value of the current secure string.

Copy() Copy() Copy() Copy()

Crea una copia de la cadena segura actual.Creates a copy of the current secure string.

Dispose() Dispose() Dispose() Dispose()

Libera todos los recursos que usa el objeto SecureString actual.Releases all resources used by the current SecureString object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Determina si el objeto especificado es igual al objeto actual.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Sirve como la función hash predeterminada.Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

Obtiene el Type de la instancia actual.Gets the Type of the current instance.

(Inherited from Object)
InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char)

Inserta un carácter en esta cadena segura en la posición de índice especificada.Inserts a character in this secure string at the specified index position.

IsReadOnly() IsReadOnly() IsReadOnly() IsReadOnly()

Indica si esta cadena segura está marcada como de solo lectura.Indicates whether this secure string is marked read-only.

MakeReadOnly() MakeReadOnly() MakeReadOnly() MakeReadOnly()

Hace que el valor de texto de esta cadena segura sea de solo lectura.Makes the text value of this secure string read-only.

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficial del objeto Object actual.Creates a shallow copy of the current Object.

(Inherited from Object)
RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32)

Quita de esta cadena segura el carácter que se encuentra en la posición de índice especificada.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char)

Reemplaza con otro carácter el carácter existente en la posición de índice especificada.Replaces the existing character at the specified index position with another character.

ToString() ToString() ToString() ToString()

Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object.

(Inherited from Object)

Se aplica a

Consulte también: