SecureString Clase

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). Esta clase no puede heredarse.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Herencia
SecureString
Implementaciones

Ejemplos

En el ejemplo siguiente se muestra cómo usar para SecureString proteger la contraseña de un usuario para usarla como credencial para iniciar un nuevo proceso.

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 SecureString clase para el nuevo desarrollo. Para obtener más información, consulte SecureString no se debe usar en GitHub.

SecureString es un tipo de cadena que proporciona una medida de seguridad. Intenta evitar almacenar cadenas potencialmente confidenciales en la memoria del proceso como texto sin formato. (Sin embargo, para conocer las limitaciones, consulte la sección ¿Cómo es secure is SecureString? ). El valor de una instancia de SecureString se protege automáticamente mediante un mecanismo admitido por la plataforma subyacente cuando se inicializa la instancia o cuando se modifica el valor. La aplicación puede representar la instancia inmutable y evitar más modificaciones invocando el MakeReadOnly método .

La longitud máxima de una SecureString instancia es de 65 536 caracteres.

Importante

Este tipo implementa la interfaz IDisposable. Cuando haya terminado de usar una instancia del tipo , debe eliminarla directa o indirectamente. Para eliminar el tipo directamente, llame a su método Dispose en un bloque try/catch. Para deshacerse de él indirectamente, use una construcción de lenguaje como using (en C#) o Using (en Visual Basic). Para más información, vea la sección "Uso de objetos que implementan IDisposable" en el tema de la interfaz IDisposable.

La SecureString clase y sus miembros no son visibles para COM. Para obtener más información, vea ComVisibleAttribute.

En esta sección:

Cadena frente a SecureString
Operaciones SecureString
SecureString e interoperabilidad
¿Qué tan seguro es SecureString?

Cadena frente a SecureString

Una instancia de la System.String clase es inmutable y, cuando ya no es necesario, no se puede programar mediante programación para la recolección de elementos no utilizados; es decir, la instancia es de solo lectura después de crearse y no es posible predecir cuándo se eliminará la instancia de la memoria del equipo. Dado que System.String las instancias son inmutables, las operaciones que parecen modificar una instancia existente crean realmente una copia de ella para manipular. Por lo tanto, si un String 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 muestre después de su uso porque la aplicación no puede eliminar los datos de la memoria del equipo.

Un SecureString objeto es similar a un String objeto en el que tiene un valor de texto. Sin embargo, el valor de un SecureString objeto está anclado en memoria, puede usar un mecanismo de protección, como el cifrado, proporcionado por el sistema operativo subyacente, se puede modificar hasta que la aplicación lo marca como de solo lectura y se puede eliminar de la memoria del equipo mediante la aplicación que llama al Dispose método o por el recolector de elementos no utilizados .NET Framework.

Para obtener una explicación de las limitaciones de la SecureString clase, consulte la sección ¿Cómo es secure is SecureString? (¿Cómo es secure is SecureString?).

Volver al principio

Operaciones SecureString

La SecureString clase incluye miembros que permiten hacer lo siguiente:

Creación de instancias de un SecureString objeto
Para crear una instancia de un SecureString objeto, llame a su constructor sin parámetros.

Agregar caracteres a un SecureString objeto
Puede agregar un solo carácter a la vez a un SecureString objeto llamando a su AppendChar método o InsertAt .

Importante

Un SecureString objeto nunca se debe construir a partir de , Stringya que los datos confidenciales ya están sujetos a las consecuencias de persistencia de memoria de la clase inmutable String . La mejor manera de construir un SecureString objeto es a partir de un origen no administrado de carácter a tiempo, como el Console.ReadKey método .

Quitar caracteres de un SecureString objeto
Para reemplazar un carácter individual, llame al SetAt método , quite un carácter individual llamando al RemoveAt método o quite todos los caracteres de la SecureString instancia llamando al Clear método .

Hacer que el SecureString objeto sea de solo lectura
Una vez que haya definido la cadena que representa el SecureString objeto, llame a su MakeReadOnly método para que la cadena sea de solo lectura.

Obtener información sobre el SecureString objeto
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 codificadas UTF16 en la cadena; y el IsReadOnlymétodo , que indica si la instancia es de solo lectura.

Liberar la memoria asignada a la SecureString instancia
Dado que SecureString implementa la IDisposable interfaz , libera su memoria llamando al Dispose método .

La SecureString clase no tiene miembros que inspeccionan, comparan o convierten el valor de .SecureString La ausencia de estos miembros ayuda a proteger el valor de una instancia frente a una exposición accidental o malintencionada. Use los miembros adecuados de la System.Runtime.InteropServices.Marshal clase, como el SecureStringToBSTR método , para manipular el valor de un SecureString objeto .

Normalmente, la biblioteca de clases de .NET Framework usa SecureString instancias de las siguientes maneras:

Volver al principio

SecureString e interoperabilidad

Dado que el sistema operativo no admite SecureStringdirectamente , debe convertir el valor del SecureString objeto en el tipo de cadena necesario antes de pasar la cadena a un método nativo. La Marshal clase tiene cinco métodos que lo hacen:

Cada uno de estos métodos crea una cadena de texto no cifrado en memoria no administrada. Es responsabilidad del desarrollador liberar y liberar esa memoria tan pronto como ya no sea necesaria. Cada uno de los métodos de conversión de cadenas y asignación de memoria tiene un método correspondiente a cero y libera la memoria asignada:

Método de asignación y conversión Método cero y libre
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Volver al principio

¿Qué tan seguro es SecureString?

Cuando se crea correctamente, una SecureString instancia proporciona más protección de datos que .String Al crear una cadena a partir de un origen de caracteres a tiempo, String crea varios intermedios en la memoria, mientras que SecureString crea solo una sola instancia. La recolección de elementos no utilizados de String objetos no es determinista. Además, dado que su memoria no está anclada, el recolector de elementos no utilizados realizará copias adicionales de String valores al mover y compactar la memoria. En cambio, la memoria asignada a un SecureString objeto está anclada y esa memoria se puede liberar llamando al Dispose método .

Aunque los datos almacenados en una SecureString instancia de son más seguros que los datos almacenados en una String instancia, hay limitaciones significativas en la seguridad de una SecureString instancia. Se incluyen los siguientes:

Plataforma
En el sistema operativo Windows, el contenido de la matriz de caracteres internos de una SecureString instancia se cifra. Sin embargo, independientemente de si faltan API o problemas de administración de claves, el cifrado no está disponible en todas las plataformas. Debido a esta dependencia de la plataforma, SecureString no cifra el almacenamiento interno en la plataforma que no es de Windows. Otras técnicas se usan en esas plataformas para proporcionar protección adicional.

Duration
Incluso si la implementación puede aprovechar el SecureString cifrado, el texto sin formato asignado a la SecureString instancia se puede exponer en varias ocasiones:

  • 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 seguro en su representación de texto sin formato para poder usarlo.

  • Cada vez que el valor de la cadena segura se modifica mediante métodos como AppendChar o RemoveAt, se debe descifrar (es decir, convertir de nuevo en texto sin formato), modificar y, a continuación, volver a cifrar.

  • 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). Para obtener más información, consulte la sección SecureString e interoperabilidad .

El intervalo de tiempo para el que se expone el valor de la SecureString instancia se reduce simplemente en comparación con la String clase .

Storage frente al uso
Por lo general, la SecureString clase define un mecanismo de almacenamiento para los valores de cadena que se deben proteger o mantener confidenciales. Sin embargo, fuera del propio .NET Framework, ningún mecanismo de uso admite SecureString. Esto significa que la cadena segura debe convertirse en un formulario utilizable (normalmente un formulario de texto no cifrado) que se puede reconocer por su destino, y que el descifrado y la conversión deben producirse en el espacio del usuario.

En general, SecureString es más seguro que String porque limita la exposición de datos confidenciales de cadena. Sin embargo, esas cadenas pueden seguir expuestas a cualquier proceso o operación que tenga acceso a la memoria sin procesar, como un proceso malintencionado que se ejecuta en el equipo host, un volcado de memoria o un archivo de intercambio visible por el usuario. 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.

Volver al principio

Constructores

SecureString()

Inicializa una nueva instancia de la clase SecureString.

SecureString(Char*, Int32)

Inicializa una nueva instancia de la clase SecureString desde una submatriz de objetos Char.

Este constructor no es conforme a CLS. La alternativa conforme a CLS es SecureString().

Propiedades

Length

Obtiene el número de caracteres de la cadena segura actual.

Métodos

AppendChar(Char)

Anexa un carácter al final de la cadena segura actual.

Clear()

Elimina el valor de la cadena segura actual.

Copy()

Crea una copia de la cadena segura actual.

Dispose()

Libera todos los recursos que usa el objeto SecureString actual.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
InsertAt(Int32, Char)

Inserta un carácter en esta cadena segura en la posición de índice especificada.

IsReadOnly()

Indica si esta cadena segura está marcada como de solo lectura.

MakeReadOnly()

Hace que el valor de texto de esta cadena segura sea de solo lectura.

MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
RemoveAt(Int32)

Quita de esta cadena segura el carácter que se encuentra en la posición de índice especificada.

SetAt(Int32, Char)

Reemplaza con otro carácter el carácter existente en la posición de índice especificada.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a

Consulte también