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.
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
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
- 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
- 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/
- siempre utilizar nombres que no sean obvios para datos sensibles como usuario y contraseña
Buenas noches, gracias por compartir esto, quisiera saber si puedes poner disponible tu proyecto completo, ya que soy un poco nuevo y tu post lo muestra incompleto gracias
No puedo por que hace parte de la APP de una empresa, trataré de hacer un mini proyecto con eso
Excelente POST
Hola, al tratar de cargar me indica un error en “Uncaught TypeError: Cannot read property ‘extend’ of undefined ”
me puedes indicar por favor que librerias js debo agragar .
Estoy agregando en forma aislada las librerias (no estoy utilizando npm y otros).
Hola, estoy epleando los codigos para prueba, pero al descencriptar desde c# me arroja una excepcion de “Longitud de datos para descifrado no válida.”
Hola, la verdad que no estoy seguro si esta código aun tiene soporte por fa revisa la libreria de JS si aun tiene soporte