Cuando hablamos de seguridad sobretodo en una aplicación expuesta en la nube nada que lo que hagamos puede ser excesivo para proteger los datos de los usuarios.

Cada vez que hacemos login nuestros datos viajan y pueden quedar atrapados sobre un sniffer sin que nos demos cuenta.

Utilizando un proyecto de prueba MVC y el fiddler como sniffer podemos observar como queda en la captura nuestro usuario contraseña.

2016-05-07_0027

2016-05-07_0027_001

 

A pesar de utiliza HTTPS es bueno proteger nuestra aplicación aplicando metodos de engaño y en este caso por Javascript podemos ofuscar los datos de usuario y contraseña o al menos la contraseña.

El siguiente es el Javascript que podemos usar para encriptar los datos:

https://code.google.com/archive/p/crypto-js/

Implementamos el código de manera muy fácil usando un metodo de javascript y lo invocamos el metodo onclick de nuestro botón

 <input type="submit" value="Log in" class="btn btn-default" onclick="SubmitsEncry();" />
 function SubmitsEncry() {

var txtPassWord = document.getElementById("Password").value.trim();

if (txtPassWord != "") {

var key = CryptoJS.enc.Utf8.parse('8080808080808080');
 var iv = CryptoJS.enc.Utf8.parse('8080808080808080');

var encryptedpassword = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(txtPassWord), key,
 {
 keySize: 128 / 8,
 iv: iv,
 mode: CryptoJS.mode.CBC,
 padding: CryptoJS.pad.Pkcs7
 });

document.getElementById("Password").value = encryptedpassword;
 }
 } 

Ya podemos observar que la contraseña pasa encriptada al hacer el POST del Login

2016-05-07_0054

Ahora solo debemos desencriptarlo con C# para poderlo usar los datos reales en el proyecto.

 public static string DecryptStringAES(string cipherText)
 {
 var keybytes = Encoding.UTF8.GetBytes("8080808080808080");
 var iv = Encoding.UTF8.GetBytes("8080808080808080");

var encrypted = Convert.FromBase64String(cipherText);
 var decriptedFromJavascript = DecryptStringFromBytes(encrypted, keybytes, iv);
 return string.Format(decriptedFromJavascript);
 }
private static string DecryptStringFromBytes(byte[] cipherText, byte[] key, byte[] iv) 
 { 
 // Check arguments. 
 if (cipherText == null || cipherText.Length <= 0) 
 { 
 throw new ArgumentNullException("cipherText"); 
 } 
 if (key == null || key.Length <= 0) 
 { 
 throw new ArgumentNullException("key"); 
 } 
 if (iv == null || iv.Length <= 0) 
 { 
 throw new ArgumentNullException("key"); 
 } 
 
 // Declare the string used to hold 
 // the decrypted text. 
 string plaintext = null; 
 
 // Create an RijndaelManaged object 
 // with the specified key and IV. 
 using (var rijAlg = new RijndaelManaged()) 
 { 
 //Settings 
 rijAlg.Mode = CipherMode.CBC; 
 rijAlg.Padding = PaddingMode.PKCS7; 
 rijAlg.FeedbackSize = 128; 
 
 rijAlg.Key = key; 
 rijAlg.IV = iv; 
 
 // Create a decrytor to perform the stream transform. 
 var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV); 
 
 try 
 { 
 // Create the streams used for decryption. 
 using (var msDecrypt = new MemoryStream(cipherText)) 
 { 
 using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
 { 
 
 using (var srDecrypt = new StreamReader(csDecrypt)) 
 { 
 // Read the decrypted bytes from the decrypting stream 
 // and place them in a string. 
 plaintext = srDecrypt.ReadToEnd(); 
 
 } 
 
 } 
 } 
 } 
 catch 
 { 
 plaintext = "keyError"; 
 } 
 } 
 
 return plaintext; 
 }

 

Invocamos el metodo  en el controlador para desencriptar el password y listo:

 model.Password= DecryptStringAES(model.Password);

 

Adicional  esto les hago las siguientes recomendaciones

  1. Siempre utilizar HTTPs en sus sitios con un certificado oficial si su aplicación va para la nube y va estar en libre acceso en internet
  2. Ofuscar todo el Javscript para que no sea obvio lo que se esta haciendo con el password antes de enviar los datos puede usar esta página http://encriptarydesencriptar.blogspot.com.co/
  3. siempre utilizar nombres que no sean obvios para datos sensibles como usuario y contraseña

 

Original: https://mteheran.wordpress.com/2016/05/07/encriptar-usuario-y-contrasena-usando-javascript-y-desencriptar-usando-c/