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.