services example encrypt cryptographic cipher c# .net cryptography encryption

c# - example - Código de cifrado/descifrado de contraseña en.NET



cryptography c# (8)

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

/// <summary> /// Encrypts a given password and returns the encrypted data /// as a base64 string. /// </summary> /// <param name="plainText">An unencrypted string that needs /// to be secured.</param> /// <returns>A base64 encoded string that represents the encrypted /// binary data. /// </returns> /// <remarks>This solution is not really secure as we are /// keeping strings in memory. If runtime protection is essential, /// <see cref="SecureString"/> should be used.</remarks> /// <exception cref="ArgumentNullException">If <paramref name="plainText"/> /// is a null reference.</exception> 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); } /// <summary> /// Decrypts a given string. /// </summary> /// <param name="cipher">A base64 encoded string that was created /// through the <see cref="Encrypt(string)"/> or /// <see cref="Encrypt(SecureString)"/> extension methods.</param> /// <returns>The decrypted string.</returns> /// <remarks>Keep in mind that the decrypted string remains in memory /// and makes your application vulnerable per se. If runtime protection /// is essential, <see cref="SecureString"/> should be used.</remarks> /// <exception cref="ArgumentNullException">If <paramref name="cipher"/> /// is a null reference.</exception> 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 codificación 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. .


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

<h2>Decryption Code</h2> @using (Html.BeginForm()) { <table class="table-bordered table"> <tr> <th>Encryption Code</th> <td><input type="text" id="txtEncrypt" name="txtEncrypt" placeholder="Enter Encryption Code" /></td> </tr> <tr> <td colspan="2"> <span style="color:red">@ViewBag.GetDecryptCode</span> </td> </tr> <tr> <td colspan="2"> <input type="submit" id="btnEncrypt" name="btnEncrypt"value="Decrypt to Encrypt code" /> </td> </tr> </table> } <br /> <br /> <br /> <h2>Encryption Code</h2> @using (Html.BeginForm()) { <table class="table-bordered table"> <tr> <th>Decryption Code</th> <td><input type="text" id="txtDecrypt" name="txtDecrypt" placeholder="Enter Decryption Code" /></td> </tr> <tr> <td colspan="2"> <span style="color:red">@ViewBag.GetEncryptionCode</span> </td> </tr> <tr> <td colspan="2"> <input type="submit" id="btnDecryt" name="btnDecryt" value="Encrypt to Decrypt code" /> </td> </tr> </table> }


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 SHA512Managed

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); }


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?


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<Byte> bytes = new List<byte>(); int b; do { b = csDecrypt.ReadByte(); if (b != -1) { bytes.Add(Convert.ToByte(b)); } } while (b != -1); return Encoding.Unicode.GetString(bytes.ToArray()); } } }


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()); } }