Concuerdo con Jesús: No reinventar la rueda no solo es más fácil sino que es
más seguro.

Mucha gente usa el mismo password para muchas cosas. Osea que no es solo tu
sistema el que esta en juego: Si un atacante consigue los passwords a través
de tu sistema, habrá conseguido acceso a las cuentas de correo de muchos de
tus usuarios, que a su vez podrá usar para recuperar el password de algunos
bancos, Amazon, etc. Osea que estarán jodidos. Y tu tendrás que decírselos.

En otras palabras: no lo hagas.


Dicho eso...
Si te sobra el tiempo para investigar y de todos modos quieres reinventar la
rueda, esto es lo mínimo que debes saber sobre el tema:


*1.* Los passwords no los guardas ni como texto plano ni encriptados. En vez
de eso, lo que guardas es un *hash*, osea una suma de comprobación ==  el
resultado de una operación matemática sobre el texto del password.

Cuando el usuario intenta loguearse hasheas el password que te da y lo
comparas con el hash guardado.
Los hashes de dos textos iguales, hasheados con el mismo algoritmo, serán
siempre iguales. Así que si el nuevo hash y el guardado coinciden es que el
password es correcto.


*2. *No sacas el hash de *solo* el password. Eso es *inseguro*.
¿Por que? Por que los hashes de dos textos iguales son siempre iguales. Eso
significa que:

*A)* Si averiguas el password de un usuario sabrás que cualquier otro
usuario con el mismo hash tiene el mismo password.
*B)* El atacante puede dejar su computadora prendida un mes y armar una
lista de hashes pre-calculados para todas las combinaciones
de letras y números hasta un largo de 6 (o más). Luego le bastaría
compararlos con los tuyos para averiguar la mayoría de los passwords.
*C)* Malas noticias: Ya muchos lo han hecho... y puedes descargarte esas
listas de Internet.

Lo que debes hacer es generar un texto al azar, juntarlo al password y
hashear el resultado:

hash = algoritmo_de_hashing( 'un_texto_al_azar_que_debería_ser_más_largo' +
password )

A este texto agregado se le llama "*sal*".

Ahora, ese texto debe ser largo (o si no está por las puras), al azar, *y
diferente para cada password*. Si no es diferente todo lo que consigues es
inutilizar las tablas pre-calculadas, pero todavía tienes los problemas de
los passwords iguales (A) y si el atacante averigua cual es tu "sal" puede
hacer su propia lista (B), pero esa lista le serviría para todos los
passwords en tu sitio. Si la sal es diferente para cada password tiene que
hacer el mismo esfuerzo no una vez sino para *cada* password.

Como necesitas saber la sal para loguear a los usuarios, debes guardarlas
con los datos de cada usuario: En otra fila o pegada al hash.

password_en_la_bd = SAL + '#' + algoritmo_de_hashing( SAL + password)

Ejemplo:

SAL
= 
'un_texto_al_azar_que_deberia_ser_mas_largo_y_que_es_exclusivo_para_este_usuario'
password_en_la_bd =  SAL + '#' + algoritmo_de_hashing( SAL + 'mi_password')

"Pero así la sal está a la vista de cualquier atacante!" dirás (si, si
dijiste eso, yo te oi). No importa: La sal solo está ahí para evitar las
tablas pre-calculadas
y que dos hashes sean iguales. Nada más (Si la sal es diferente para cada
password tiene que hacer el mismo esfuerzo no una vez sino para *cada*
password).

Pero puedes hacer tu sistema más seguro agregándole... "*pimienta*" (los
informáticos a los que se les ocurrió todo esto tenían hambre).

Una pimienta es un texto como la sal pero:
- Es la misma para todos los passwords
- No la guardas en la base de datos sino en tu código o en un archivo
aparte, como el sitio donde guardas la contraseña de la base de datos.

La idea de la pimienta es hacer que el atacante tenga que ganar acceso no
solo a tu base de datos sino tambien al servidor donde está el código del
programa
antes de que pueda intentar romper los passwords por fuerza bruta.

El código quedaría así:

password_en_la_bd = SAL + '#' + algoritmo_de_ hashing( SAL + PIMIENTA +
password)


*3.*  Hay varios algoritmos de hashing y no todos son buenos para guardar
passwords.

Algunos son: MD5, SHA1, SHA256, SHA512
Usar MD5 está muy mal visto, SHA1 para arriba es lo que más se usa.

En el fondo todos tienen un problema: Son muy rápidos y paralelizables. Osea
que probar decenas o cientos de combinaciones por segundo
depende solo de cuantas computadoras puedas conseguir.

La solución es usar un algoritmo de hashing diseñado para ser mucho más
lento y secuencial

Del lado de los usuarios de la web eso no importa: De todas formas el cuello
de botella es la base de datos y dibujar la página, no el algoritmo para
hashear el password. Si este demora dies veces más ni siquiera lo notarán.

Pero para el atacante significa demorar un mes en probar las combinaciones
que antes podía probar en tres días.

El algoritmo que buscas es *bcrypt*:
http://www.mindrot.org/projects/jBCrypt/
(que de paso también se encarga de salar el password)


*4. *La cadena se rompe en el eslabón más debil, así que no dejes de prestar
atención al sistema para recuperar passwords (osea generar uno nuevo, el
password nunca debe poder recuperarse),
la forma de guardar las cookies de sesión, etc. que son formas de loguearse
sin tener el password... por lo menos las cuentas de correo ya están seguras
:)


Suerte y disfruta la programación

Juan Pablo


---
Juan Pablo Scaletti



2010/1/26 Jesus Hinojosa <[email protected]>

> la mayoria de frameworks ya traen un modulo para authenticacion, porque
> reinventar la rueda?
>
> El 26 de enero de 2010 19:22, Brando <[email protected]> escribió:
>
>>  Hola Amigos de la lista, recurro a Uds. por un tema que quizás muchos de
>> aquí conozcan y me puedan orientar. Bueno resulta que estoy desarrollando un
>> sistema web (Java, JSP, Struts, etc.) y dentro del esquema de desarrollo
>> está la parte de seguridad para el tema de almacenamiento de password de
>> usuarios en un base de datos. Estuve revisando algo de información al
>> respecto y tenía dudas para el tipo de encriptado o codificación (corríjanme
>> si me equivoco en los términos), inicialmente estuve revisando algo acerca
>> de utilizar AES como algoritmo de encriptación y por allí me sugirieron
>> mejor utilizar HASH, entonces allí es donde se me genero la duda.
>>
>> La pregunta es puntual, que me podrían sugerir Uds. en base a sus
>> experiencias?, este sistema manejara información critica entonces quisiera
>> manejar esta parte de la seguridad de la mejor forma.
>>
>>
>>
>> Espero haberme hecho entender.
>>
>>
>>
>> Gracias por la atención
>>
>>
>>
>> Saludos.
>>
>>
>>
>> Brando.
>>
>>
>>
>> _______________________________________________
>> Lista de correo Linux-plug
>> Temática: Discusión general sobre Linux
>> Peruvian Linux User Group (http://www.linux.org.pe)
>>
>> Participa suscribiéndote y escribiendo a:  [email protected]
>> Para darte de alta, de baja  o hacer ajustes a tu suscripción visita:
>> http://listas.linux.org.pe/mailman/listinfo/linux-plug
>>
>> IMPORTANTE: Reglas y recomendaciones
>> http://www.linux.org.pe/listas/reglas.php
>> http://www.linux.org.pe/listas/comportamiento.php
>> http://www.linux.org.pe/listas/recomendaciones.php
>>
>
>
>
> --
> Jesus Hinojosa Palma
> Cel RPC +51 1 989097034
> Cel RPM 99620 7436 - #945571
>
> _______________________________________________
> Lista de correo Linux-plug
> Temática: Discusión general sobre Linux
> Peruvian Linux User Group (http://www.linux.org.pe)
>
> Participa suscribiéndote y escribiendo a:  [email protected]
> Para darte de alta, de baja  o hacer ajustes a tu suscripción visita:
> http://listas.linux.org.pe/mailman/listinfo/linux-plug
>
> IMPORTANTE: Reglas y recomendaciones
> http://www.linux.org.pe/listas/reglas.php
> http://www.linux.org.pe/listas/comportamiento.php
> http://www.linux.org.pe/listas/recomendaciones.php
>



-- 

Juan Pablo Scaletti
_______________________________________________
Lista de correo Linux-plug
Temática: Discusión general sobre Linux
Peruvian Linux User Group (http://www.linux.org.pe)

Participa suscribiéndote y escribiendo a:  [email protected]
Para darte de alta, de baja  o hacer ajustes a tu suscripción visita:
http://listas.linux.org.pe/mailman/listinfo/linux-plug

IMPORTANTE: Reglas y recomendaciones
http://www.linux.org.pe/listas/reglas.php
http://www.linux.org.pe/listas/comportamiento.php
http://www.linux.org.pe/listas/recomendaciones.php

Responder a