Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Clase SecureString

 

Publicado: octubre de 2016

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.

Espacio de nombres:   System.Security
Ensamblado:  mscorlib (en mscorlib.dll)

System.Object
  System.Security.SecureString

public sealed class SecureString : IDisposable

NombreDescripción
System_CAPS_pubmethodSecureString()

Inicializa una nueva instancia de la clase SecureString.

System_CAPS_pubmethodSecureString(Char*, Int32)

Esta API admite la infraestructura producto y no está diseñada para usarse directamente desde el código. Inicializa una nueva instancia de la clase SecureString desde una submatriz de objetos System.Char.

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

NombreDescripción
System_CAPS_pubpropertyLength

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

NombreDescripción
System_CAPS_pubmethodAppendChar(Char)

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

System_CAPS_pubmethodClear()

Elimina el valor de la cadena segura actual.

System_CAPS_pubmethodCopy()

Crea una copia de la cadena segura actual.

System_CAPS_pubmethodDispose()

Libera todos los recursos que usa el objeto SecureString actual.

System_CAPS_pubmethodEquals(Object)

Determina si el objeto especificado es igual al objeto actual.(Heredado de Object).

System_CAPS_pubmethodGetHashCode()

Sirve como la función hash predeterminada.(Heredado de Object).

System_CAPS_pubmethodGetType()

Obtiene el Type de la instancia actual.(Heredado de Object).

System_CAPS_pubmethodInsertAt(Int32, Char)

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

System_CAPS_pubmethodIsReadOnly()

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

System_CAPS_pubmethodMakeReadOnly()

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

System_CAPS_pubmethodRemoveAt(Int32)

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

System_CAPS_pubmethodSetAt(Int32, Char)

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

System_CAPS_pubmethodToString()

Devuelve una cadena que representa al objeto actual. (Heredado de Object).

SecureStringes 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. (Para conocer las limitaciones, sin embargo, consulte la ¿Es seguro SecureString? sección.) El valor de una instancia de SecureString automáticamente está protegido mediante un mecanismo compatible con la plataforma subyacente cuando se inicializa la instancia o cuando se modifica el valor. La aplicación puede volver la instancia inalterable y evitar la modificación posterior al invocar el MakeReadOnly método.

La longitud máxima de un SecureString instancia es de 65.536 caracteres.

System_CAPS_importantImportante

Este tipo implementa la IDisposable interfaz. Cuando haya terminado de utilizar una instancia del tipo, debe eliminar del mismo directa o indirectamente. Para deshacerse del tipo directamente, llame a su Dispose método en un try/catch bloque. Para deshacerse de él 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 "Uso de un objeto que implementa IDisposable" en el IDisposable tema de la interfaz.

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

En esta sección:

Cadena de vs. SecureString
Operaciones de SecureString
SecureString e interoperabilidad
¿Es seguro SecureString?

Una instancia de la System.String clase es inmutable y, cuando ya no necesite, no se pueden programar mediante programación para la recolección; es decir, la instancia es de solo lectura después de crearlo, y no es posible predecir cuándo se eliminarán la instancia de la memoria del equipo. Dado que System.String las instancias son inmutables, las operaciones que parecen modificar una instancia existente realmente crean una copia del mismo para manipular. Por lo tanto, si un String objeto contiene información confidencial, como una contraseña, tarjeta de crédito o datos personales, existe un riesgo para la información se pueda revelar una vez utilizada, porque la aplicación no puede eliminar los datos de la memoria del equipo.

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

Para obtener una explicación de las limitaciones de la SecureString de clases, consulte la ¿es seguro SecureString? sección.

Volver al principio

La SecureString clase incluye miembros que le permiten hacer lo siguiente:

Crear una instancia de un SecureString objeto

Cree instancias de un SecureString objeto mediante una llamada a su constructor sin parámetros.

Agregar caracteres a un SecureString objeto

Puede agregar un único carácter a la vez a un SecureString objeto mediante una llamada a su AppendChar o InsertAt método.

System_CAPS_importantImportante

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

Quite los caracteres de un SecureString objeto

Puede reemplazar un carácter individual mediante una llamada a la SetAt método, quitar un carácter individual mediante una llamada a la RemoveAt método o quitar todos los caracteres de la SecureString instancia mediante una llamada a la Clear método.

Realizar la SecureString objeto de solo lectura

Una vez haya definido la cadena que el SecureString representa el objeto, se llama a su MakeReadOnly método para crear la cadena de solo lectura.

Obtener información sobre la SecureString objeto

El SecureString clase tiene solo dos miembros que proporcionan información acerca de la cadena: su Length propiedad, lo que indica el número de unidades de código codificado en UTF16 en la cadena; y la IsReadOnly, mé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, libere su memoria mediante una llamada a la Dispose método.

El SecureString clase no tiene ningún miembro que inspeccione, compare o convierta el valor de un SecureString. La ausencia de estos miembros le ayuda a proteger el valor de la instancia de una exposición accidental o malintencionada. Use los miembros adecuados de la System.Runtime.InteropServices.Marshal de la clase, como el SecureStringToBSTR método, para manipular el valor de un SecureString objeto.

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

Volver al principio

Dado que el sistema operativo no admite directamente SecureString, debe convertir el valor de la 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 hacen esto:

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

Método de asignación y conversión

Cero y free (método)

Marshal.SecureStringToBSTR

Marshal.ZeroFreeBSTR

Marshal.SecureStringToCoTaskMemAnsi

Marshal.ZeroFreeCoTaskMemAnsi

Marshal.SecureStringToCoTaskMemUnicode

Marshal.ZeroFreeCoTaskMemUnicode

Marshal.SecureStringToGlobalAllocAnsi

Marshal.ZeroFreeGlobalAllocAnsi

Marshal.SecureStringToCoTaskMemUnicode

Marshal.ZeroFreeGlobalAllocUnicode

Volver al principio

Cuando se crea correctamente, un SecureString instancia proporciona más protección de datos que un String. Al crear una cadena de un origen de un carácter a la vez, String crea varios intermedio en la memoria, mientras que SecureString crea una sola instancia. Colección de elementos no utilizados de String objetos es no determinista. Además, porque no está anclada su memoria, el recolector de elementos no utilizados a realizar copias adicionales de String valores al mover y compactar la memoria. En cambio, la memoria asignada a un SecureString objeto está anclado y se puede liberar esa memoria mediante una llamada a la Dispose método.

Aunque los datos se almacenan en un SecureString instancia es más segura que los datos almacenados en una String de la instancia, hay limitaciones significativas en el nivel de seguridad un SecureString es la instancia. Se incluyen los siguientes:

Plataforma

En el sistema operativo Windows, el contenido de un SecureString se cifra la matriz de caracteres interno de la instancia. Sin embargo, si debido a falta de API o problemas de administración de claves, cifrado no está disponible en todas las plataformas. Por este motivo, SecureString está disponible en el escritorio (sólo Windows) y no en .NET Core.

Duración

Incluso si la SecureString implementación es capaz de aprovechar las ventajas del cifrado, el texto sin formato asignado a la SecureString instancia puede quedar expuesta en momentos diferentes:

  • Dado que Windows no ofrece una implementación de la cadena segura en el nivel de sistema operativo, .NET Framework aún que convertir el valor de cadena segura en su representación de texto sin formato para poder utilizarlo.

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

  • Si la cadena segura se utiliza en una llamada de interoperabilidad, se debe convertir a 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 el SecureString se expone el valor de la instancia se acorta simplemente en comparación con el String clase.

Almacenamiento y uso

Por lo general, la SecureString clase define un mecanismo de almacenamiento para los valores de cadena que debe estar protegido o confidencial. Sin embargo, fuera de .NET Framework, donde se admite ningún mecanismo de uso SecureString. Esto significa que la cadena segura debe convertirse en un formato utilizable (normalmente una forma 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.

General, SecureString es más seguro que String porque se limita la exposición de datos de cadena que depende. Sin embargo, esas cadenas todavía pueden quedar expuestas a cualquier proceso u operación que tiene acceso a la memoria sin formato, como un proceso malintencionado ejecutándose en el equipo host, un volcado de proceso o un archivo de intercambio visibles para el usuario. En lugar de usar SecureString para proteger las contraseñas, la alternativa recomendada es utilizar un identificador opaco a las credenciales que se almacenan fuera del proceso.

Volver al principio

En el ejemplo siguiente se muestra cómo utilizar un SecureString para proteger la contraseña de un usuario para su uso como una 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();
        }
    }
}

.NET Framework
Disponible desde 2.0

Cualquier miembro ( Compartido en Visual Basic) estático público de este tipo es seguro para subprocesos. No se garantiza que los miembros de instancia sean seguros para subprocesos.

Volver al principio
Mostrar: