Clase System.Security.SecureString
Importante
Se recomienda no usar la SecureString
clase para el nuevo desarrollo en .NET (Core) o al migrar código existente a .NET (Core). Para obtener más información, consulte SecureString no debe usarse.
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 potencialmente confidenciales en la memoria del proceso como texto sin formato. (Sin embargo, para ver las limitaciones, consulte ¿Qué seguridad es SecureString? section.) 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.
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, 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 marque como de solo lectura y se pueda eliminar de la memoria del equipo, ya sea mediante la aplicación que llama al Dispose método o mediante el recolector de elementos no utilizados de .NET.
Para obtener una explicación de las limitaciones de la SecureString clase, consulte la sección ¿Cómo es SecureString?
Operaciones secureString
La SecureString clase incluye miembros que permiten hacer lo siguiente:
Crear una instancia de un objeto Crea una SecureString instancia de un SecureString objeto 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 , 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 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 SecureString instancia De SecureString porque implementa la IDisposable interfaz , su memoria se libera llamando al Dispose método .
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 suele usar SecureString instancias de las maneras siguientes:
Para proporcionar información de contraseña a un proceso mediante la ProcessStartInfo estructura o llamando a una sobrecarga del Process.Start método que tiene un parámetro de tipo SecureString.
Para proporcionar información de contraseña de red llamando a un NetworkCredential constructor de clase que tiene un parámetro de tipo SecureString o mediante la NetworkCredential.SecurePassword propiedad .
Para proporcionar información de contraseña para la autenticación de SQL Server llamando al SqlCredential.SqlCredential constructor o recuperando el valor de la SqlCredential.Password propiedad .
Para pasar una cadena al código no administrado. Para obtener más información, consulte la sección SecureString e interoperabilidad .
SecureString e interoperabilidad
Dado que el sistema operativo no admite SecureStringdirectamente , debe convertir el valor del objeto en el tipo de SecureString cadena necesario antes de pasar la cadena a un método nativo. La Marshal clase tiene cinco métodos que lo hacen:
Marshal.SecureStringToBSTR, que convierte el SecureString valor de cadena en una cadena binaria (BSTR) reconocida por COM.
Marshal.SecureStringToCoTaskMemAnsi y Marshal.SecureStringToGlobalAllocAnsi, que copian el valor de SecureString cadena en una cadena ANSI en memoria no administrada.
Marshal.SecureStringToCoTaskMemUnicode y Marshal.SecureStringToGlobalAllocUnicode, que copian el valor de SecureString cadena en una cadena Unicode en memoria no administrada.
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 cadena y asignación de memoria tiene un método correspondiente a cero y libera la memoria asignada:
¿Qué seguridad 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 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 son más seguros que los datos almacenados en una String instancia, existen limitaciones importantes sobre la seguridad de una SecureString instancia. Entre ellas se incluyen las siguientes:
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.
Duration
Incluso si la implementación puede aprovechar el SecureString cifrado, el texto sin formato asignado a la SecureString instancia 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 Más generalmente, 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.