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 proteger la contraseña de un usuario y usarla como credencial para SecureString 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 clase para SecureString el nuevo desarrollo. Para obtener más información, vea SecureString no debe usarse en GitHub.

SecureString es un tipo de cadena que proporciona una medida de seguridad. Intenta evitar almacenar cadenas potencialmente confidenciales en la memoria de proceso como texto sin formato. (Sin embargo, para ver las limitaciones, consulte la sección ¿Qué seguridad es SecureString?). El valor de una instancia de se protege automáticamente mediante un mecanismo admitido por la plataforma subyacente cuando se inicializa la instancia o SecureString cuando se modifica el valor. La aplicación puede representar la instancia inmutable y evitar más modificaciones mediante la invocación del 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 desecharla 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 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 System.String equipo. Dado System.String que 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 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 pueda revelar después de su uso porque la aplicación no puede eliminar los datos de la memoria del String equipo.

Un SecureString objeto es similar a un objeto en que tiene un valor de String texto. Sin embargo, el valor de un 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 método o por el recolector de elementos no utilizados de SecureString Dispose .NET Framework.

Para obtener una explicación de las limitaciones de la SecureString clase , consulte la sección ¿Cómo de seguro es 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 instancias de un SecureString objeto, llame a su constructor sin parámetros.

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

Importante

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

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

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

Obtener información sobre el SecureString objeto
La clase solo tiene dos miembros que proporcionan información sobre la cadena: su propiedad , que indica el número de unidades de código codificadas con UTF16 en la cadena; y el método , , que indica si la instancia es de solo SecureString Length IsReadOnly lectura.

Liberar la memoria asignada a la SecureString instancia
Dado SecureString que implementa la interfaz , se libera su memoria mediante una llamada al método IDisposable 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 una instancia frente a una exposición accidental o malintencionada. Use los miembros System.Runtime.InteropServices.Marshal adecuados de la clase , como el SecureStringToBSTR método , para manipular el valor de un objeto SecureString .

La .NET Framework de clases utiliza normalmente SecureString instancias de las maneras siguientes:

Volver al principio

SecureString e interoperabilidad

Dado que el sistema operativo no admite directamente , debe convertir el valor del objeto al tipo de cadena necesario antes de pasar la cadena SecureString SecureString 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 administrado en memoria no administrada. El desarrollador es responsable de cero y liberar esa memoria en cuanto ya no se necesite. Cada uno de los métodos de conversión de cadenas y asignación de memoria tiene un método correspondiente para cero y liberar la memoria asignada:

Método de asignación y conversión Método cero y gratuito
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, SecureString una instancia de proporciona más protección de datos que String . Al crear una cadena a partir de un origen de caracteres a la vez, crea varios elementos intermedios en memoria, mientras que crea String SecureString una sola instancia. La recolección de String elementos no utilizados de objetos no es determinista. Además, dado que su memoria no está anclada, el recolector de elementos no utilizados realizará copias adicionales de valores al mover y String compactar memoria. En cambio, la memoria asignada a un objeto se ancla y esa memoria se puede liberar SecureString llamando al Dispose método .

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

Plataforma
En el Windows operativo, se cifra el contenido de la matriz de caracteres interna SecureString de una instancia. 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, no cifra el almacenamiento interno en la SecureString plataforma que no Windows datos. Otras técnicas se usan en esas plataformas para proporcionar protección adicional.

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

  • Dado 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.

  • Cada vez que el valor de la cadena segura se modifica mediante métodos como o , se debe descifrar (es decir, volver a convertir en texto sin formato), modificarse y, a AppendChar continuación, RemoveAt cifrarse 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, vea la sección SecureString e interoperabilidad.

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

Storage frente al uso
Por lo general, la clase define un mecanismo de almacenamiento para los valores de cadena que SecureString se deben proteger o mantener confidenciales. Sin embargo, fuera de la .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 su destino pueda reconocer, y que el descifrado y la conversión deben producirse en el espacio del usuario.

En general, SecureString es más seguro que porque limita la exposición de datos de cadena String confidenciales. Sin embargo, esas cadenas todavía pueden exponerse 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 proceso o un archivo de intercambio que el usuario puede ver. En lugar de usar para proteger las contraseñas, la alternativa recomendada es usar un identificador opaco para las credenciales que SecureString 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