Siéntete libre de corregirme si mis suposiciones están mal aquí, pero déjame explicarte por qué pregunto.
Tomado de MSDN, a SecureString
:
Representa texto que debe mantenerse confidencial. El texto está encriptado para mayor privacidad cuando se usa, y se elimina de la memoria de la computadora cuando ya no es necesario.
Entiendo esto, tiene mucho sentido almacenar una contraseña u otra información privada en un SecureString
over a System.String
, porque puedes controlar cómo y cuándo se almacena realmente en la memoria, porque a System.String
:
es inmutable y, cuando ya no se necesita, no se puede programar mediante programación para la recolección de basura; es decir, la instancia es de solo lectura después de su creación y no es posible predecir cuándo se eliminará de la memoria de la computadora. En consecuencia, si un objeto String 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 revele después de ser utilizada porque su aplicación no puede eliminar los datos de la memoria de la computadora.
Sin embargo, en el caso de una aplicación GUI (por ejemplo, un cliente ssh), el SecureString
debe construirse a partir de a System.String
. Todos los controles de texto usan una cadena como su tipo de datos subyacente .
Entonces, esto significa que cada vez que el usuario presiona una tecla, la cadena anterior que estaba allí se descarta y se crea una nueva cadena para representar cuál es el valor dentro del cuadro de texto, incluso si se usa una máscara de contraseña. Y no podemos controlar cuándo o si alguno de esos valores se descarta de la memoria .
Ahora es el momento de iniciar sesión en el servidor. ¿Adivina qué? Debe pasar una cadena por la conexión para la autenticación . Así que vamos a convertir nuestro SecureString
en un System.String
... y ahora tenemos una cadena en el montón sin forma de forzarlo a pasar por la recolección de basura (o escribir 0 en su búfer).
Mi punto es : no importa lo que haces, en algún lugar a lo largo de la línea, que SecureString
se va a convertir en una System.String
, lo que significa que al menos existe en el montón en algún momento (sin ninguna garantía de recolección de basura).
Mi punto no es : si hay formas de eludir el envío de una cadena a una conexión ssh, o evitar que un control almacene una cadena (haga un control personalizado). Para esta pregunta, puede reemplazar "conexión ssh" con "formulario de inicio de sesión", "formulario de registro", "formulario de pago", "formulario de alimentos que alimentaría a su cachorro pero no a sus hijos", etc.
- Entonces, ¿en qué momento el uso de a se
SecureString
vuelve realmente práctico? - ¿Alguna vez vale la pena el tiempo de desarrollo adicional para erradicar por completo el uso de un
System.String
objeto? - ¿El objetivo
SecureString
es simplemente reducir la cantidad de tiempo que aSystem.String
está en el montón (reduciendo el riesgo de pasar a un archivo de intercambio físico)? - Si un atacante ya tiene los medios para una inspección de montón, lo más probable es que (A) ya tenga los medios para leer las pulsaciones de teclas, o (B) ya tenga físicamente la máquina ... Así que usar un
SecureString
impedimento para que llegue datos de todos modos? - ¿Es esto simplemente "seguridad a través de la oscuridad"?
Lo siento si estoy planteando las preguntas demasiado, la curiosidad me ganó. No dude en responder cualquiera o todas mis preguntas (o dígame que mis suposiciones están completamente equivocadas). :)
SecureString
no es realmente una cadena segura. Es simplemente una forma de disminuir el intervalo de tiempo en el que alguien puede inspeccionar su memoria y obtener con éxito los datos confidenciales. Esto no es a prueba de balas y no estaba destinado a serlo. Pero los puntos que estás planteando son muy válidos. Relacionado: stackoverflow.com/questions/14449579/…