SecureString Clase

Definición

Representa el texto que se debe mantener confidencial, como eliminarlo de la memoria del equipo cuando ya no sea necesario. 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

Se recomienda no usar la SecureString clase para el nuevo desarrollo en .NET (Core) o al migrar desde .NET Framework. Para obtener más información, consulte SecureString no debe usarse.

Note

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

SecureString es un tipo de cadena que proporciona una medida de seguridad. Intenta evitar almacenar cadenas que pueden ser confidenciales en la memoria de proceso como texto plano. (Sin embargo, para ver las limitaciones, consulte la sección ¿Cómo es 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 IDisposable interfaz . 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 eliminarlo indirectamente, use una construcción de lenguaje como using (en C#) o Using (en Visual Basic). Para obtener más información, vea la sección "Using an Object that Implements IDisposable" (Usar un objeto que implementa IDisposable) en el tema de interfaz IDisposable .

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

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 manipularla. 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 un 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.
  • Podría usar un mecanismo de protección, como el cifrado, proporcionado por el sistema operativo subyacente.
  • Se puede modificar hasta que la aplicación la marque como de solo lectura.
  • La aplicación puede eliminarse de la memoria del equipo llamando al Dispose método o mediante el recolector de elementos no utilizados de .NET.

Para obtener una explicación de las limitaciones de la clase SecureString, consulte la sección ¿Qué tan seguro es SecureString?

Operaciones de SecureString

La SecureString clase incluye miembros que permiten hacer lo siguiente:

Crear una instancia de un objeto SecureString Puedes crear una instancia de un objeto SecureString llamando 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 String ya que los datos confidenciales ya están sujetos a las consecuencias de la persistencia en la memoria de la clase inmutable String. La mejor manera de construir un objeto SecureString es a partir de un origen no gestionado que procese un carácter a la vez, como el método Console.ReadKey.

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

Haga 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 tiene solo 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.

Libere la memoria asignada a la instancia SecureString porque SecureString implementa la interfaz IDisposable, su memoria se libera llamando al método Dispose.

La SecureString clase no tiene miembros que inspeccionen, comparen o conviertan el valor de .SecureString La ausencia de estos miembros ayuda a proteger el valor de la instancia frente a la 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 .

La biblioteca de clases de .NET comúnmente utiliza SecureString instancias de las siguientes maneras:

SecureString e interoperabilidad

Dado que el sistema operativo no admite directamente SecureString, debe convertir el valor del objeto SecureString al tipo de cadena requerido 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 poner a cero y liberar esa memoria en cuanto 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 para poner a cero y liberar 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

¿Qué tan segura 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 carácter por carácter, String crea varios objetos intermedios en la memoria, mientras que SecureString crea una sola instancia. La recolección de elementos no utilizados basura de objetos String no es determinista. Además, dado que su memoria no está anclada, el recolector de basura realizará copias adicionales de los valores de String 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 son más seguros que los datos almacenados en una String instancia, existen limitaciones importantes sobre la seguridad de una SecureString instancia. Estos incluyen:

  • Plataforma

    En el sistema operativo Windows, el contenido de la matriz de caracteres internos de una SecureString instancia se cifra. Sin embargo, debido a problemas de administración de claves o API que faltan, 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.

  • Duración

    Incluso si la implementación puede aprovechar el cifrado SecureString, el texto plano asignado a la instancia SecureString puede exponerse en varias ocasiones:

    • Dado que Windows no ofrece una implementación de cadena segura en el nivel de sistema operativo, .NET todavía tiene que convertir el valor de cadena segura en su representación de texto sin formato para usarlo.
    • Cada vez que el valor de la cadena segura se modifica mediante métodos como AppendChar o RemoveAt, se debe descifrar (es decir, volver a convertir a texto sin formato), modificar y, a continuación, cifrar de nuevo.
    • 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 .

  • Almacenamiento 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 de .NET en sí, 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 su destino puede reconocer y que el descifrado y la conversión deben producirse en el espacio de usuario.

En general, SecureString es más seguro que String porque limita la exposición de datos de cadena confidenciales. Sin embargo, esas cadenas todavía se pueden exponer 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 de proceso 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.

Constructores

Nombre Description
SecureString()

Inicializa una nueva instancia de la clase SecureString.

SecureString(Char*, Int32)

Inicializa una nueva instancia de la SecureString clase a partir de una subbarray de Char objetos.

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

Propiedades

Nombre Description
Length

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

Métodos

Nombre Description
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 utilizados por el objeto actual SecureString .

Equals(Object)

Determina si el objeto especificado es igual al objeto actual.

(Heredado de Object)
GetHashCode()

Actúa como 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 Objectactual.

(Heredado de Object)
RemoveAt(Int32)

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

SetAt(Int32, Char)

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

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a

Consulte también