Si solo va a verificar/validar el nombre de usuario y contraseña ingresados, use la clase Rfc2898DerivedBytes (también conocida como Función de derivación de clave basada en contraseña 2 o PBKDF2). Esto es más seguro que usar cifrado como Triple DES o AES porque no hay una forma práctica de pasar del resultado de RFC2898DerivedBytes a la contraseña. Solo puede pasar de una contraseña al resultado. Vea Is it ok to use SHA1 hash of password as a salt when deriving encryption key and IV from password string? para un ejemplo y discusión para .Net o String encrypt/decrypt with password c# Metro Style para WinRT/Metro.
Si está almacenando la contraseña para su reutilización, como el suministro a un tercero, utilice el Windows Data Protection API (DPAPI). Esto utiliza claves protegidas y generadas por el sistema operativo y el algoritmo de cifrado Triple DES para cifrar y descifrar información. Esto significa que su aplicación no tiene que preocuparse por generar y proteger las claves de cifrado, una preocupación importante al usar la criptografía.
En C#, use la clase System.Security.Cryptography.ProtectedData. Por ejemplo, para cifrar un pedazo de datos, utilice ProtectedData.Protect()
:
// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext;
// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(entropy);
}
byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
DataProtectionScope.CurrentUser);
tienda de la entropía y el texto cifrado de forma segura, como en un archivo o clave de registro con los permisos definidos de modo que sólo el usuario actual puede leerlo. Para conseguir el acceso a los datos originales, utilice ProtectedData.Unprotect()
:
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
DataProtectionScope.CurrentUser);
Tenga en cuenta que existen consideraciones de seguridad adicionales. Por ejemplo, evite almacenar secretos como contraseñas como string
.Las cadenas son inmutables, ya que no se pueden notificar en la memoria para que alguien que esté mirando la memoria de la aplicación o un volcado de memoria pueda ver la contraseña. Use SecureString o un byte [] en su lugar y recuerde desecharlos o ponerlos en cero tan pronto como ya no necesite la contraseña.
Antes que nada, no guarde la contraseña. Hash it (posiblemente con un valor de sal), y guardar eso en su lugar. – carlosfigueira
"Usuarios" ¿te refieres a usuarios habituales de Windows u otra cosa? (Creo que te refieres a que algunos de tus propios "usuarios" ya que los usuarios normales de Windows ya no pueden ver los datos de los demás ...) –
He editado tu título. Por favor, consulte: "[¿Las preguntas deberían incluir" etiquetas "en sus títulos?] (Http://meta.stackexchange.com/questions/19190/)", donde el consenso es "no, no deberían". –