Código de cifrado / descifrado de contraseña en .NET

Quiero un cifrado simple y descifrado de la contraseña en C #. ¿Cómo guardar la contraseña en formato cifrado en la base de datos y recuperarla como formato original mediante descifrado?

Aqui tienes. Lo encontré en algún lado en internet. Funciona bien para mi

///  /// Encrypts a given password and returns the encrypted data /// as a base64 string. ///  /// An unencrypted string that needs /// to be secured. /// A base64 encoded string that represents the encrypted /// binary data. ///  /// This solution is not really secure as we are /// keeping strings in memory. If runtime protection is essential, ///  should be used. /// If  /// is a null reference. public string Encrypt(string plainText) { if (plainText == null) throw new ArgumentNullException("plainText"); //encrypt data var data = Encoding.Unicode.GetBytes(plainText); byte[] encrypted = ProtectedData.Protect(data, null, Scope); //return as base64 string return Convert.ToBase64String(encrypted); } ///  /// Decrypts a given string. ///  /// A base64 encoded string that was created /// through the  or ///  extension methods. /// The decrypted string. /// Keep in mind that the decrypted string remains in memory /// and makes your application vulnerable per se. If runtime protection /// is essential,  should be used. /// If  /// is a null reference. public string Decrypt(string cipher) { if (cipher == null) throw new ArgumentNullException("cipher"); //parse base64 string byte[] data = Convert.FromBase64String(cipher); //decrypt data byte[] decrypted = ProtectedData.Unprotect(data, null, Scope); return Encoding.Unicode.GetString(decrypted); } 

EDITAR: esta es una respuesta muy antigua. SHA1 quedó en desuso en 2011 y ahora se ha roto en la práctica. https://shattered.io/ Use un estándar más nuevo en su lugar (por ejemplo, SHA256, SHA512, etc.).

Si su respuesta a la pregunta en mi comentario es “No”, esto es lo que uso:

  public static byte[] HashPassword(string password) { var provider = new SHA1CryptoServiceProvider(); var encoding = new UnicodeEncoding(); return provider.ComputeHash(encoding.GetBytes(password)); } 

Esta pregunta responderá cómo cifrar / descifrar: Cifrar y desencriptar una cadena

No especificó una base de datos, pero querrá codificarla en base-64, usando Convert.toBase64String. Para un ejemplo, puede usar: http://www.opinionatedgeek.com/Blog/blogentry=000361/BlogEntry.aspx

A continuación, guárdelo en varchar o en clob, dependiendo de cuánto tiempo sea su mensaje cifrado, pero para una contraseña, debe funcionar un varchar.

Los ejemplos anteriores también cubrirán el descifrado después de decodificar el base64

ACTUALIZAR:

En realidad, es posible que no necesite usar la encoding base64, pero me pareció útil, en caso de que quisiera imprimirla, o enviarla a través de la web. Si el mensaje es lo suficientemente largo, me pareció útil comprimirlo primero, luego encriptar, ya que es más difícil usar fuerza bruta cuando el mensaje ya estaba en forma binaria, por lo que sería difícil saber cuándo se rompió el cifrado. .

Yo uso RC2CryptoServiceProvider.

  public static string EncryptText(string openText) { RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(); ICryptoTransform encryptor = rc2CSP.CreateEncryptor(Convert.FromBase64String(c_key), Convert.FromBase64String(c_iv)); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { byte[] toEncrypt = Encoding.Unicode.GetBytes(openText); csEncrypt.Write(toEncrypt, 0, toEncrypt.Length); csEncrypt.FlushFinalBlock(); byte[] encrypted = msEncrypt.ToArray(); return Convert.ToBase64String(encrypted); } } } public static string DecryptText(string encryptedText) { RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(); ICryptoTransform decryptor = rc2CSP.CreateDecryptor(Convert.FromBase64String(c_key), Convert.FromBase64String(c_iv)); using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(encryptedText))) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { List bytes = new List(); int b; do { b = csDecrypt.ReadByte(); if (b != -1) { bytes.Add(Convert.ToByte(b)); } } while (b != -1); return Encoding.Unicode.GetString(bytes.ToArray()); } } } 

Uno de los métodos más sencillos de encriptación (si absolutamente DEBE crear uno usted mismo, dado que .NET ya tiene esas asombrosas bibliotecas de cifrado [proporcionadas por Cogwheel justo antes]], es XOR el valor ASCII de cada carácter de la cadena de entrada contra un valor conocido de “clave”. La funcionalidad XOR en C # se logra usando la tecla ^ creo.

Luego puede convertir los valores del resultado de XOR a Caracteres ASCII y almacenarlos en la base de datos. Esto no es muy seguro, pero es uno de los métodos de encriptación más fáciles.

Además, si utilizo una base de datos de acceso, he encontrado que algunos caracteres cuando se colocan delante de una cadena hacen que todo el campo sea ilegible cuando se abre la base de datos. Pero el campo aún es legible por su aplicación, aunque está en blanco para un usuario malintencionado. Pero quién usa el acceso de todos modos ¿verdad?

  string clearText = txtPassword.Text; string EncryptionKey = "MAKV2SPBNI99212"; byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); using (Aes encryptor = Aes.Create()) { Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); encryptor.Key = pdb.GetBytes(32); encryptor.IV = pdb.GetBytes(16); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(clearBytes, 0, clearBytes.Length); cs.Close(); } clearText = Convert.ToBase64String(ms.ToArray()); } } 

Primero crea una clase como:

 public class Encryption { public static string Encrypt(string clearText) { string EncryptionKey = "MAKV2SPBNI99212"; byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); using (Aes encryptor = Aes.Create()) { Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); encryptor.Key = pdb.GetBytes(32); encryptor.IV = pdb.GetBytes(16); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(clearBytes, 0, clearBytes.Length); cs.Close(); } clearText = Convert.ToBase64String(ms.ToArray()); } } return clearText; } public static string Decrypt(string cipherText) { string EncryptionKey = "MAKV2SPBNI99212"; byte[] cipherBytes = Convert.FromBase64String(cipherText); using (Aes encryptor = Aes.Create()) { Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); encryptor.Key = pdb.GetBytes(32); encryptor.IV = pdb.GetBytes(16); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)) { cs.Write(cipherBytes, 0, cipherBytes.Length); cs.Close(); } cipherText = Encoding.Unicode.GetString(ms.ToArray()); } } return cipherText; } } 

** En el controlador **

agregar referencia para esta clase de encriptación:

 using testdemo.Models public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(string text) { if (Request["txtEncrypt"] != null) { string getEncryptionCode = Request["txtEncrypt"]; string DecryptCode = Encryption.Decrypt(HttpUtility.UrlDecode(getEncryptionCode)); ViewBag.GetDecryptCode = DecryptCode; return View(); } else { string getDecryptCode = Request["txtDecrypt"]; string EncryptionCode = HttpUtility.UrlEncode(Encryption.Encrypt(getDecryptCode)); ViewBag.GetEncryptionCode = EncryptionCode; return View(); } } 

En vista

 

Decryption Code

@using (Html.BeginForm()) {
Encryption Code
@ViewBag.GetDecryptCode
}


Encryption Code

@using (Html.BeginForm()) {
Decryption Code
@ViewBag.GetEncryptionCode
}

Puede usar la biblioteca de criptografía .Net administrada y luego guardar la cadena cifrada en la base de datos. Cuando desee verificar la contraseña, puede comparar la cadena de la base de datos almacenada con el valor hash de la entrada del usuario. Consulte aquí para obtener más información acerca de SHA512 administrado

utilizando System.Security.Cryptography;

  public static string EncryptSHA512Managed(string password) { UnicodeEncoding uEncode = new UnicodeEncoding(); byte[] bytPassword = uEncode.GetBytes(password); SHA512Managed sha = new SHA512Managed(); byte[] hash = sha.ComputeHash(bytPassword); return Convert.ToBase64String(hash); } 
Intereting Posts