2011-06-26 21 views
10

He estado escribiendo un pequeño programa para mí mismo usando C# que puedo usar para almacenar mis contraseñas y luego recuperarlas para verlas/editarlas.SecureString para almacenar en memoria y presentar contraseñas? ¿O algo mas?

Mientras que las contraseñas se almacenan en el disco en un formato cifrado, cuando se leen en la memoria para mostrar/editar en un formulario, no están cifradas.

He aprendido que tener contraseñas no encriptadas en la memoria es un problema de seguridad bastante grande, así que me encontré con la clase SecureString.

¿Habría una manera más segura de hacer esto que usar la clase SecureString, o SecureString está a la altura de su nombre?

+6

* Nunca * almacene contraseñas, ni siquiera cifradas. Solo almacena su hash. –

+4

@HansPassant buen consejo, pero esto suena como un administrador de contraseñas. Obviamente, un administrador de contraseñas no puede salirse con la suya almacenando solo hashes. –

Respuesta

10

SecureString mantiene su texto encriptado en la memoria y puede desecharlo inmediatamente cuando no lo necesite. El problema es que, cuando desea mostrarlo o utilizarlo de cualquier otra manera, debe convertirlo en una cadena normal, que no es segura.

Además, no confiaría demasiado en él: el sistema puede descifrarlo sin ninguna clave de descifrado, lo que significa que el hacker determinado probablemente pueda hacer lo mismo. Cuando un hacker obtiene el control de su computadora, no puede estar seguro de nada y probablemente podrá acceder a cualquier cosa que no esté encriptada utilizando un buen algoritmo con buena clave.

1

SecureString es exactamente lo que dice su nombre y adivinó: guarda la cadena también cifrada en la memoria, por lo que sí, es la forma correcta de hacerlo.
Ver HERE:

Representa el texto que debe tenerse confidencial. El texto está encriptado para mayor privacidad cuando se usa, y borrado de la memoria de la computadora cuando ya no es necesario . Esta clase no puede ser heredada.

7

SecureString va de alguna manera para asegurar la instancia en la memoria de una cadena, sin embargo, debe tener en cuenta algunos inconvenientes importantes.

  • Un SecureString (al igual que svick señala) puede ser recuperada sin una clave de descifrado, por lo que cualquier hacker lo suficientemente capacitado para recuperar este trozo de memoria que puede asumir con seguridad puede realizar fácilmente esta operación menor para recuperar la cadena de texto sin formato . Tenga en cuenta la simplicidad de SecureStringToBSTR(input);
  • SecureString debe rellenarse en carácter por carácter, ya que no hay ninguna propiedad .Text Obtiene o establece el acceso de acceso a usar. Incluyendo en los blogs de MSDN que a menudo se ve código como el siguiente:

    public static SecureString StringToSecureString(string input) 
    { 
        SecureString output = new SecureString(); 
        int l = input.Length; 
        char[] s = input.ToCharArray(0, l); 
        foreach (char c in s) 
        { 
         output.AppendChar(c); 
        } 
        return output; 
    } 
    

El problema significativo con este código es que el desarrollador permitió la cadena input-vez existen en la memoria en el primer lugar.El control de usuario o WinForm cuadro de texto de PasswordBox utilizan para recoger esta contraseña del usuario nunca debe recoger toda la contraseña en una sola operación, como

  • Los hackers pueden acceder a la memoria directamente y recuperar la contraseña directamente desde el control en la pila o Inyectar código para recuperar la contraseña en la instanciación de este método
  • Si su último Volcado de memoria aún reside en su máquina desde su última pantalla azul, y este control se rellenó con su contraseña de texto plano, entonces la contraseña se encuentra en una pequeño archivo ordenado listo para que su pirata informático lo recoja y lo utilice en su tiempo libre.

Considere las opciones donde KeyPress se utiliza para recuperar cada carácter del usuario, de lo contrario, PasswordBox de WPF está respaldado por una SecureString por defecto, creo (alguien más puede confirmar esto).

Finalmente, existen formas mucho más simples de recopilar contraseñas de usuarios como Key Loggers. Mi recomendación es considerar su demografía de usuario, riesgo de exposición, y determinar si algo como trivial como SecureString realmente va a cortarlo.

+0

De hecho, voy a degradar esta respuesta porque sugirió que un registrador de claves es una forma viable de resolver este problema. Los keyloggers están fundamentalmente en contra del protocolo de seguridad y cualquier corporación responsable de inmediato incendiará a cualquiera que haya escrito un keylogger y lo haya puesto en un entorno de producción. Me hice cargo de un equipo de programadores que fueron despedidos por hacerlo. Todos perdieron sus trabajos. –

+0

¡Muy interesante! –

+3

@ ScottShaw-Smith, sé que esto es viejo, pero no creo que sugiera el uso de registradores de teclas como "una forma viable de resolver este problema". Más bien, él está diciendo que usar SecureString + KeyPress no ayudará a asegurar la contraseña si los hackers están usando keyloggers. –

-1

Ustedes están haciendo esta VÍA demasiado complicado. Nadie preguntó si esta era la mejor manera de resolver el problema. Solo quieren ver un código de trabajo. Por Dios En este ejemplo, passwordPre es una cadena que se descifró de un recurso (por ejemplo, un archivo de configuración) utilizando su algoritmo de descifrado patentado.

string passwordPre = DecryptProprietary(objectReferringToPassword); 
    char[] passwordChars = passwordPre.ToCharArray();   
    System.Security.SecureString securePassword = new System.Security.SecureString(); // in production, this should probably be a global variable 
    foreach (char c in passwordChars) 
     securePassword.AppendChar(c); 

    string decryptedPassword = new System.Net.NetworkCredential(string.Empty, securePassword).Password; // this is how to convert it to a string for quick usage to access the protected resource 

por lo que utilizar la contraseña de descifrado rápido para acceder a cualquier recurso que necesita y disponer de él saliendo del método.

+0

uhhh .... algoritmo de desencriptación patentado? –

Cuestiones relacionadas