Si solo va a verificar / validar el nombre de usuario y la 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 existe una forma práctica de pasar del resultado de RFC2898DerivedBytes a la contraseña. Solo puede pasar de una contraseña al resultado. Consulte ¿Está bien usar el hash de contraseña SHA1 como una sal al derivar la clave de cifrado y el IV de la cadena de contraseña? para ver un ejemplo y una discusión para .Net o String encriptar / desencriptar con contraseña c # Estilo Metro para WinRT / Metro.
Si está almacenando la contraseña para reutilizarla, por ejemplo, proporcionándola a un tercero, utilice la API de protección de datos de Windows (DPAPI) . Utiliza claves protegidas y generadas por el sistema operativo y el algoritmo de cifrado Triple DES para cifrar y descifrar la información. Esto significa que su aplicación no tiene que preocuparse por generar y proteger las claves de cifrado, una de las principales preocupaciones al utilizar la criptografía.
En C #, use la clase System.Security.Cryptography.ProtectedData . Por ejemplo, para cifrar un dato, 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);
Almacene la entropía y el texto cifrado de forma segura, como en un archivo o clave de registro con permisos establecidos para que solo el usuario actual pueda leerlos. Para acceder a los datos originales, use 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, por lo que alguien que mire 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 deshacerse de ellos o ponerlos a cero tan pronto como la contraseña ya no sea necesaria.