En el desarrollo de aplicaciones modernas, es un pecado capital almacenar la contraseña de un usuario en texto plano. Almacenada en texto plano, la contraseña de un usuario está disponible para cualquier persona, desde piratas informáticos que rastrean el tráfico de red hasta empleados internos descontentos. Una vez que estas personas malas tienen contraseñas de texto claro, pueden acceder fácilmente a las cuentas asociadas.

Las aplicaciones modernas de hoy necesitan usar contraseñas hash criptográficamente seguras. Echemos un vistazo a la definición abstracta de cómo funciona esto, luego veremos las muy pocas líneas de AVR para el código .NET requerido para implementarlo (gracias a .NET Framework).

Cómo funciona el hashing de contraseñas

Hay muchos algoritmos de hashing. Primero consideramos el hashing SHA-256. Este algoritmo devuelve un hash de 64 caracteres de la entrada. Este generador de hash SHA-256 en línea muestra que cuando hash 'apple' obtienes el valor:

3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b

Con métodos de hash más antiguos y menos seguros, el valor de hash es siempre el mismo. Con SHA-256, la palabra "apple" siempre tiene el valor anterior. (Pruébalo aquí y aquí también).

La contraseña nunca se almacena para una comparación posterior. La contraseña hash se almacena. Los hashes no son cifrados; un valor hash no se puede decodificar de nuevo a su valor original. En el hash de contraseñas, una contraseña se hace hash dos veces. Una vez cuando se almacena y luego nuevamente cuando se valida la contraseña. Al iniciar sesión, el usuario proporciona su contraseña de Apple y su hash se compara con el hash almacenado. Si coinciden, el usuario se autentica.

Una forma en que un hacker puede derrotar el hashing simple como el anterior es con un ataque de diccionario. Imagine que se produjo una gran violación de seguridad en muchas identificaciones de usuario y contraseñas. Armado con una larga lista de palabras (incluidas las contraseñas típicas como contraseña1 o qwerty), el hacker compara el valor hash de cada palabra con los hashes pirateados. Cuando se encuentra una coincidencia, el pirata informático acaba obteniéndola. Si su fe en la humanidad le impide pensar que alguien podría ser tan malvado, descargue listas de palabras para este propósito aquí).

Un aspecto interesante del hash es que si bien cualquier algoritmo crea un hash de longitud fija (SHA-256 crea un hash de 64 caracteres), la longitud de entrada es, para todos los efectos, ilimitada. El valor a continuación es el hash SHA-256 de la letra de Keep on Rocking en el mundo libre de Neil Young. Loco, ¿eh?

874cd53c306e6e98e5cde23abfb28df5eb27faf90c7bc6f51fdd16b20ea9e311

Una pizca de sal

La necesidad de minimizar el éxito de los ataques de diccionario lleva al concepto de agregar un valor de sal a la contraseña para ayudar a derrotar los ataques de diccionario. Un valor de sal es un agregado aleatorio a la contraseña antes de que se divida. (¿Por qué lo llaman sal?). Por ejemplo, digamos que agregamos adDl [! 4 & T a la palabra manzana antes de mezclarla. Como tiempo de validación, también agregamos ese valor antes de codificarlo. Es poco probable que la lista de palabras del hacker tenga palabras que comiencen con adDl [! 4 & T, pero con una lista lo suficientemente grande podría.

Un mejor algoritmo

La necesidad de contraseñas altamente seguras condujo al desarrollo de mejores técnicas de hash en los últimos años. Estos algoritmos se consideran criptográficamente seguros porque cumplen con los estándares que los hacen mucho más difíciles de adivinar. Ahora se recomienda encarecidamente que utilice un algoritmo que utilice el algoritmo PBKDF2 o bcrypt para cifrar las contraseñas. A diferencia del algoritmo basado en SHA (y otros), estos algoritmos más nuevos no repiten valores hash para una entrada. Este generador de hash bcrypt en línea creó los dos hashes diferentes para la palabra apple:

$2y$12$KBtBsSi8HZai.XDBO3kr2u2kC7Utq37n37m/WIipEEZGOabX101zq
$2y$12$072epNcNAWho0yqq/zjxpOkhtpJvkMvVdr3EfpM5Rm/207o/zh8XG

El uso de la función de validación del algoritmo muestra que ambos coinciden con la palabra apple.

Aunque el hash SHA-256 no está a la altura para la administración moderna de contraseñas, hay muchos lugares donde usarlo sigue siendo apropiado. Git, la utilidad de control de código fuente abierto, utiliza hashes basados en SHA como identificadores de contenido para rastrear los cambios en el código fuente. Git se encuentra actualmente en el proceso de pasar del muy antiguo estándar SHA-1 a SHA-256.

Hashing de contraseñas con AVR para .NET.

Dada esa introducción rápida al hash de contraseña, volvamos nuestra atención al hash de contraseña con AVR para .NET.

La clase FormsAuthentication en el espacio de nombres System.Web.Security de Microsoft tiene un método llamado HashPasswordForStoringInConfigFile que crea contraseñas hash. Sin embargo, ese método ha sido marcado como obsoleto y se recomienda que no lo use. No es compatible con PBKDF2 y no genera una contraseña segura criptográficamente.

Si está utilizando HashPasswordForStoringInConfigFile considere cambiarlo pronto por el método que se describe a continuación. Hacerlo requiere que todos los usuarios cambien sus contraseñas

La solución de recomendación actual de Microsoft para contraseñas hash creadas es usar su marco de Membresía. Sin embargo, ese marco es específico de SQL Server y para usarlo con otra base de datos o almacén de datos, debe subclasificarlo e implementar sus métodos. Esta no es una tarea trivial.

Sin embargo, hay una escotilla de escape mal documentada. Microsoft tiene una biblioteca de clases (una DLL) llamada System.Web.Helpers.Crypto disponible en Nuget que ofrece una clase con los métodos criptográficamente seguros compatibles con PBKDF2 que necesitamos. Estos métodos también generan automáticamente un valor de sal aleatorio. AVR no funciona bien con algunos paquetes de Nuget, así que esta es la mejor manera de obtener la DLL que necesita:

  1. Vaya a este enlace Nuget y haga clic en el enlace "Descargar paquete". Esto coloca un archivo llamado "system.web.helpers.crypto.3.2.3.nupkg" en su sistema.

  2. Un archivo Nuget es realmente un archivo comprimido. Use una utilidad de descompresión para descomprimirlo (es posible que deba cambiarle el nombre con una extensión .zip). Después de descomprimir, un archivo llamado lib\Net40\System.Web.Helpers.dll está disponible.

  3. Establezca una referencia a ese archivo en su proyecto AVR y luego estará listo para usar el código a continuación.

Este video de cuatro minutos muestra el proceso anterior en acción.

Solo una pizca de código

La creación de una contraseña hash criptográficamente segura con AVR para .NET requiere solo una línea de código con la biblioteca que descargamos de Nuget:

HashedPassword = System.Web.Helpers.Crypto.HashPassword(Password) 

El valor devuelto por el método HashPassword es una cadena de 68 caracteres. Este es el valor que debe almacenarse en la fila del usuario en su fila de autenticación. Si bien su longitud es de 68 caracteres, considere hacer que su columna de contraseña sea mucho más larga (quizás 255 caracteres) para que en el futuro si el algoritmo se actualiza no necesite cambiar su base de datos.

La autenticación de la contraseña hash también requiere solo una línea de código. El fragmento de código a continuación asume que ha leído la fila de autenticación del usuario con la identificación del usuario y ha puesto la contraseña cifrada en el campo HashedPassword.

If System.Web.Helpers.Crypto.VerifyHashedPassword(HashedPassword, Password))
    // User authenticated             
Else
    // User not authenticated
EndIf 

Si ha implementado su propio mecanismo de contraseña, o si está utilizando el método HashPasswordForStoringInConfigFile en desuso, considere pasar a los métodos seguros proporcionados por Microsoft con su biblioteca de cifrado.

Recuerde, también, que no importa cómo esté almacenando las contraseñas, las aplicaciones en red, especialmente las aplicaciones de Internet, siempre deben usar HTTPS / TSL (SSL). De lo contrario, las contraseñas de los usuarios se pasan como texto sin cifrar y se pueden interceptar.



Por favor, inicie sesión o cree una cuenta para enviar comentarios.