Si vas a copiar

.. y pegar este post en tu web o blog personal, por favor te pido que coloques el link del post de donde lo copiastes:

Fuente:

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

31 de octubre de 2012 3 comentarios:


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

Publicar un comentario

3 comentarios:

Vega dijo...

¿y para cuando se actualizara?

Anónimo dijo...

Tengo una duda con respecto a este metodo de encriptación. Estoy trabajando en C# y para encriptar un pass hago lo siguiente

string Encriptado = BCrypt.Net.BCrypt.HashPassword(miPassword, BCrypt.Net.BCrypt.GenerateSalt());

Bueno eso lo codifica y lo guardo en la DB

Acá las preguntas
1) Como no me podia loguear cree dos usuarios diferentes con la misma pass y las encripta diferentes. ¿Esto es así?
2) Cuando me quiero loguear con el usuario me dice que el pass es incorrecto y lo que hago es comprobar el pass que ingreso yo con el pass desencriptado de la DB.

BCrypt.Net.BCrypt.Verify(miPassword, passwordEnLaDB)

Eso me tendría que devolver true (en mi caso) y nada. Andará mal? Estoy haciendo algo mal?

Con este código encuentro el usuario con el que quiero loguearme.

var empleado = (from e in CarniceriasLelfunDB.empleados
where (e.ID == codigo) && (BCrypt.Net.BCrypt.Verify(miPassword, e.passwordEnLaDB))
select e.ID).Single();
return CargarEmpleado(empleado);


Espero que puedas ayudarme. Gracias!

tttony dijo...

En este post --> http://tttony.blogspot.com/2010/08/sistema-de-login-en-c-con-access-2007-u.html

Hice un ejemplo de como trabajar con BCrypt

Respuestas:
1) Si, siempre son diferentes
2) Primero creas un SELECT para solo buscar el usuario, luego la contraseña de dicho usuario la verificas con BCrypt.Net.BCrypt.Verify

Buscar en el Blog



PUBLICIDAD