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
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:
- GenerateSalt()
- HashPassword()
- HashString()
- 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:
- Encriptar la contraseña cuando se agregue/edite un usuario
- 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:
¿y para cuando se actualizara?
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!
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
Publicar un comentario