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
