Wednesday 31 October 2012

La mejor forma de encriptar contraseñas en C# y VB.NET

bcrypt es seguro


Hace como dos años hice este post pero la encriptacion md5 es considerada insegura, incluso desde mucho antes de crear ese post

¿Porque md5 es inseguro?


Con el hardware actual es posible crackear md5, de hecho en internet hay herramientas y hasta paginas web como http://crackstation.net/ que te ayudan a crackear no solo md5 sino una amplia cantidad de algoritmos de hash/encriptacion, pero existe una utilidad mucho mas poderosa capaz de crackear md5 llamada oclHashcat-lite que usa el procesador grafico GPU(tarjeta de video/grafica)

Esta utilidad es capaz de crackear los siguientes algoritmos:

  • MD5
  • md5($pass.$salt)
  • Joomla
  • SHA1
  • nsldap, SHA-1(Base64), Netscape LDAP SHA
  • sha1($pass.$salt)
  • nsldaps, SSHA-1(Base64), Netscape LDAP SSHA
  • Oracle 11g
  • MSSQL(2000)
  • MSSQL(2005)
  • MySQL
  • MD4
  • md4($pass.$salt)
  • NTLM
  • Domain Cached Credentials, mscash
  • SHA256
  • sha256($pass.$salt)
  • descrypt, DES(Unix), Traditional DES
  • SHA512
  • sha512($pass.$salt)
  • SL3
  • Cisco-PIX MD5
  • Double MD5
  • vBulletin < v3.8.5
  • vBulletin > v3.8.5
  • IPB2+, MyBB1.2+
  • LM
  • Oracle 7-10g, DES(Oracle)
  • y muchos mas...

Segun http://www.codinghorror.com/blog/2012/04/speed-hashing.html arroja estos resultados en este GPU y CPU:

  • Radeon 7970           8213.6 M c/s
  • 6-core AMD CPU   52.9     M c/s
 (PRONTO HARE PRUEBAS EN MI AMD HIS 6950 2GB Y CORE i5 2500K)

Ejecute el archivo: oclExample.cmd que contiene el siguiente comando de prueba:

oclHashcat-lite64.exe 9b957cc6ab97cbf88c4f6f0f146adafe

Tardo elrededor de 20minutos para crackear con:


  • AMD 6950 2GB: 4600 M/s
AMD 6950 2GB

Tardo alrededor de 20 minutos en crackear

Con una carga de 96% y 71° de temperatura


Sin duda las tarjetas ATi/AMD son las mejores para este tipo de trabajo

Es por eso que la mejor opcion es Bcrypt


Que para definirlo brevemente es:  

Una funcion derivada de claves

Para la tecnologia .NET tenemos esta libreria llamada BCypt.NET, te puedes descargar la libreria y el codigo fuente tambien, incluso viene con UnitTest para testearla

Recuerda agregar el archivo BCrypt.Net.dll como referencia al proyecto

Es muy sencillo de usar ya que posee solo cuatro metodos y ademas son estaticos, asi que no es necesario instanciar la clase BCrypt para acceder a esos metodos:

  1. GenerateSalt()
  2. HashPassword()
  3. HashString()
  4. Verify()

La documentacion te la puedes descargar de aqui, es un archivo de ayuda de Windows que por cierto esta en ingles, pero como dije es muy facil de usar

Existen dos pasos importantes aqui a la hora de de/encriptar contraseñas:

  1. Encriptar la contraseña cuando se agregue/edite un usuario
  2. Usar el metodo Verify() para verificar que la contraseña de la base de datos corresponde con la contraseña dada

Codigo C#: (pseudocodigo por los momentos)

Aqui tengo un sistema de login usando esta encriptacionen Access 2007

/*
* Creado por tttony 2012
* http://tttony.blogspot.com/
*
* POR FAVOR NO BORRES ESTE COMENTARIO
*/

public bool AddUser(string name, string pass)
{
string hashed = BCrypt.Net.BCrypt.HashPassword(pass, BCrypt.Net.BCrypt.GenerateSalt());

//
// Agregar aqui la sentencia sql INSERT para guardar el usuario
// y contraseña encriptada
//

// Retornar el valor necesario
//
return false;
}

public bool Login(string name, string pass)
{
//
// Primero encuentra el usuario
//
// SELECT * FROM TablaUsuarios WHERE = 'name'
//
// if (founds == 1) si encontro uno
//
// Entonces con el objecto del usuario encuentra la contraseña
// y pasala a la funcion BCrypt.Net.BCrypt.Verify()
//

//
// La funcion Verify() verifica si la contraseña encriptada que
// esta guardada en la base de datos contiene la palabara clave
// con la contraseña dada
//
bool verify = BCrypt.Net.BCrypt.Verify(pass, password);

return verify;
}


ESTE POST SE ACTUALIZARA


Publicado en tttony.blogspot.com

No comments:

Post a Comment