Esta aplicación muestra un formulario con un cuadro de texto donde el usuario debe ingresar una contraseña utilizada para descifrar un documento.en C#, ¿cuál es la forma correcta de manejar datos confidenciales como una contraseña?
tengo código que se parece a esto:
string password = passwordTextBox.Text;
...
DecryptDocument(password);
Pero me dijeron que, técnicamente hablando, esto es un problema de seguridad, ya que los datos que representa la contraseña podría permanecer en la memoria incluso después de la aplicación es cerrado.
He intentado utilizar la clase System.Security.SecureString pero ahora estoy tratando con punteros a CoTaskMem que parece empeorar el problema:
SecureString password = new SecureString();
foreach(char i in passwordTextBox.Text.ToCharArray())
password.AppendChar(i);
IntPtr ptr = Marshal.SecureStringToCoTaskMemAnsi(password);
int length = password.Length;
byte[] bytes = new byte[length];
Marshal.Copy(ptr, bytes, 0, length);
DecryptDocument(Encoding.Default.GetString(bytes));
Marshal.FreeCoTaskMem(ptr);
Como se puede ver, no se ve como si estuviera haciendo la aplicación más segura, ya que tarde o temprano tendré que tomar la entrada (passwordTextBox.Text) y convertirla en una cadena que pueda pasar a la función DecryptDocument().
¿Hay alguna manera de resolver este problema o debería tratar con esta vulnerabilidad de seguridad?
"Pero técnicamente, se trata de una falla de seguridad, porque los datos que representan la contraseña pueden permanecer en la memoria incluso después de cerrar la aplicación." ** - Si bien esto es cierto, lo haría estar en una ubicación aleatoria en la memoria. No le preocupa nada. ** "¿Hay alguna manera de resolver este problema o debería tratar con esta vulnerabilidad de seguridad?" ** ¿Qué vulnerabilidad sería? ** –
Sería esta vulnerabilidad: http: // cwe .mitre.org/data/definitions/316.html –
@Ramhound, si no te preocupa tener el texto en una ubicación aleatoria en la memoria, entonces no vale la pena usar SecureString en absoluto. Para ser justos, realmente solo agrega una pequeña cantidad de seguridad; la principal preocupación son los depósitos de emergencia, aunque ya pueden filtrar todo tipo de información confidencial (es decir, todo lo que actualmente se descifró para fines de trabajo). Lo único que SecureString realmente le compra es una probabilidad reducida de filtrar una frase de contraseña, lo que podría comprometer potencialmente una clave (u otros servicios a los que acceda el usuario afectado si reutilizan su frase de contraseña). –