2012-06-15 9 views
9

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?

+0

"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? ** –

+2

Sería esta vulnerabilidad: http: // cwe .mitre.org/data/definitions/316.html –

+2

@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). –

Respuesta

7

Si realmente desea utilizar SecureString, debe utilizarse de extremo a extremo, preferiblemente solo cada vez que se interactúa un carácter a la vez. Siempre que la cadena se descifre en una matriz de caracteres, querrá borrarla explícitamente de la memoria cuando termine de usarla. Consecuencias de esto:

  1. Debe usar un control de TextBox seguro que funcione con SecureString directamente. Ver here para un buen ejemplo.

  2. Debe modificar DecryptDocument para tomar un SecureString directamente.

  3. Deseará implementar el descifrado para que pase el menor tiempo posible con los caracteres descifrados. Algunas de las arquitecturas de cifrado en .NET realmente admiten SecureString directamente. De lo contrario, su mejor opción es utilizar el búfer no administrado y borrarlo explícitamente cuando haya terminado con él.

Cuestiones relacionadas