2010-01-07 25 views
17

En una aplicación web escrita en Perl y utilizando PostgreSQL, los usuarios tienen nombre de usuario y contraseña. ¿Cuál sería la forma recomendada de almacenar las contraseñas?¿Cuál es la forma recomendada de cifrar contraseñas de usuario en una base de datos?

Cifrado utilizando la función crypt() de Perl y una sal al azar? Eso limitaría la longitud útil de las contraseñas a 8 caracteres y requerirá recuperar la contraseña almacenada para compararla con la dada por el usuario al autenticarse (para obtener la sal que estaba adjuntada).

¿Hay una forma incorporada en PostgreSQL para hacer esto?

¿Debo utilizar Digest::MD5?

Respuesta

-1

Use el hash SHA1 o SHA256 con salazón. Ése es el camino a seguir para almacenar contraseñas.

+1

También recuerde saltear sus contraseñas. http://www.aspheute.com/english/20040105.asp –

+0

Asegúrese de que no necesita admitir esquemas de autenticación basados ​​en hash. Lamento mi decisión de cifrar la contraseña en una base de datos debido a un nuevo requisito para admitir el esquema de LDAP {SSHA}. –

+2

@ZZ Coder: ¿y por qué es eso un problema? Simplemente cree su nuevo conjunto y cuando un usuario inicie sesión, haga magia detrás de escena para actualizarla en su nueva base de datos. Debería * nunca * almacenar contraseñas que puedan recuperarse en texto sin formato y el uso de hash es una buena forma de hacerlo. –

-3

Sugeriría almacenarlo como un hash md5 salado.

INSERT INTO user (password) VALUES (md5('some_salt'||'the_password')); 

Se podría calcular el hash MD5 en Perl si lo desea, no hay mucha diferencia a menos que esté micro-optimización.

También podría usar sha1 como alternativa, pero no estoy seguro si Postgres tiene una implementación nativa de esto.

Normalmente desaconsejo el uso de una sal aleatoria dinámica, ya que es otro campo que debe almacenarse en la base de datos. Además, si tus mesas se vieron comprometidas, la sal se vuelve inútil.

Siempre voy con una sal generada al azar por única vez y la almacena en el origen de la aplicación o en un archivo de configuración.

Otra ventaja de utilizar un hash md5 o sha1 para la contraseña es que puede definir la columna de contraseña como un ancho fijo CHAR (32) o CHAR (40) para md5 y sha1, respectivamente.

+2

MD5 ha sido considerado inseguro por algún tiempo. SHA1 o SHA256 se deben usar – EKS

+4

Eh, también he leído esas publicaciones en el blog.Para el 90% (arbitrario) de casos de uso md5 es más que adecuado. – hobodave

+0

Sí, pero ¿por qué usar md5 si sha1 funciona igual y proporciona un poco más de seguridad? No tiene sentido elegir md5 por encima de sha1, excepto si tiene un espacio de almacenamiento limitado o potencia de cálculo. – Henri

0

Si no usa un mecanismo de recuperación de contraseña (No restablecimiento de contraseña), creo que usar un mecanismo de hashing es mejor que tratar de encriptar la contraseña. Puede verificar los hashes sin ningún riesgo de seguridad. Incluso usted no conoce la contraseña del usuario.

+1

Dado que mencionó la función crypt() de Perl, que "crea una cadena de resumen exactamente como la función crypt (3) en la biblioteca C", sospecho que sabe que deberían usar un mecanismo hash y que estaba usando la terminología equivocada . –

2

El módulo pgcrypto en PostgreSQL ha suppotr orden interna de hash de la clave, que es bastante inteligente sobre el almacenamiento, generación, multi-algoritmo etc. Ver http://www.postgresql.org/docs/current/static/pgcrypto.html, la sección sobre contraseña Funciones Hashing. También puede ver la sección pgcrypto de http://www.hagander.net/talks/hidden%20gems%20of%20postgresql.pdf.

+0

Implementé pgcrypto recientemente, y es bastante molesto trabajar en su base de datos (y debe ser muy cuidadoso con las consultas que lo utilizan, lo que si los formatea de cierta manera puede realmente ralentizar la ejecución). Tienes que instalar el módulo, ejecutar un script como root, y solo entonces puedes usar 'crypt'. es seguro, pero no es fácil de agregar. Si tiene un buen algoritmo hash de nivel de código, esa puede ser una buena alternativa. – Kzqai

17

MD5 se usa comúnmente, pero SHA1/SHA256 es mejor. Todavía no es el mejor, pero mejor.

El problema con todos estos algoritmos de hash de uso general es que están optimizados para ser rápidos. Sin embargo, cuando usa sus contraseñas para el almacenamiento, lo rápido que desea no es querer, si puede usar la contraseña en un microsegundo, significa que un atacante puede probar un millón de contraseñas cada segundo si obtienen su contraseña. manos en su base de datos de contraseñas.

Pero quiere reducir la velocidad de un atacante tanto como sea posible, ¿no? ¿No sería mejor usar un algoritmo que demora una décima de segundo para cifrar la contraseña? Una décima de segundo es lo suficientemente rápida como para que los usuarios no lo noten, pero un atacante que tenga una copia de su base de datos solo podrá hacer 10 intentos por segundo; les llevará 100.000 veces más encontrar un conjunto de trabajo. de credenciales de inicio de sesión.Cada hora que les tomaría en un microsegundo por intento se convierte en 11 años a una décima de segundo por intento.

Entonces, ¿cómo lograr esto? Algunas personas lo simulan ejecutando varias rondas de digestión MD5/SHA, pero el algoritmo bcrypt está diseñado específicamente para abordar este problema. No entiendo completamente las matemáticas detrás de esto, pero me dicen que se basa en la creación de marcos Blowfish, que es intrínsecamente lento (a diferencia de las operaciones MD5 que pueden ser altamente optimizadas en hardware configurado correctamente), y tiene una parámetro de "costo" ajustable para que, a medida que avanza la Ley de Moore, todo lo que necesita hacer es ajustar ese "costo" para mantener el hash de la contraseña tan lento en diez años como lo es hoy.

+0

+1. Interesante. –

+0

+1 para anotar el tiempo adicional para un método más seguro generalmente no será lo suficientemente grande como para ser notado por los usuarios finales. –

29

No use SHA1 o SHA256, como la mayoría de las personas están sugiriendo. Definitivamente no use MD5.

SHA1/256 y MD5 están diseñados para crear sumas de comprobación de archivos y cadenas (y otros tipos de datos, si es necesario). Debido a esto, están diseñados para ser lo más rápido posible, de modo que la suma de comprobación se genere rápidamente.

Esta velocidad rápida hace que sea mucho más fácil contraseñas de fuerza bruta, ya que un programa bien escrito puede generar miles de hash por segundo.

En su lugar, utilice un algoritmo lento que está diseñado específicamente para contraseñas. Están diseñados para demorar un poco más en generar, con la ventaja de que los ataques de fuerza bruta se vuelven mucho más difíciles. Debido a esto, las contraseñas serán mucho más seguras.

No experimentará ninguna desventaja de rendimiento significativo si solo está buscando cifrar contraseñas individuales de una en una, que es la implementación normal de almacenamiento y comprobación de contraseñas. Es solo a granel donde está la diferencia real.

Personalmente me gusta bcrypt. Debería haber una versión de Perl disponible, ya que una búsqueda rápida en Google arrojó varias coincidencias posibles.

+1

No tiene idea de lo que está hablando, aléjese de las etiquetas de seguridad. Los algoritmos de resumen de mensaje se refieren a datos de compendio muy rápidamente y tratan de ser imposibles de revertir. NIST no aprobaría un algoritmo criptográfico lento. – rook

+0

No estoy hablando de reversión, estoy hablando de fuerza bruta. Y si no tengo idea de lo que estoy hablando, supongo que personas como Paul Buchheit (1) (el creador de Gmail) y Phusion (2) tampoco tienen idea. Incluso Google recomienda (3) bcrypt en uno de sus proyectos. Y estos fueron solo algunos de los enlaces que encontré simplemente buscando en Google "use bcrypt". – vonconrad

+0

Enlaces para el comentario anterior: 1: http://paulbuchheit.blogspot.com/2007/09/quick-read-this-if-you-ever-store.html 2: http: //blog.phusion .nl/2009/08/13/securely-store-passwords-with-bcrypt-ruby-now-compatible-with-jruby-and-ruby-1-9/ 3: http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ – vonconrad

3

Me gusta bcrypt el mejor, con SHA2 (256) en segundo lugar. Nunca he visto MD5 usado para contraseñas, pero tal vez algunas aplicaciones/bibliotecas lo usan. Tenga en cuenta que siempre debe usar una sal también. La sal en sí debe ser completamente única para cada usuario y, en mi opinión, el mayor tiempo posible. Nunca, nunca usaría solo un hash contra una cuerda sin agregarle sal. Principalmente porque soy un poco paranoico y también para que sea un poco más a prueba de futuro.

Tener una demora antes de que un usuario pueda volver a intentarlo y bloqueos automáticos (con notificaciones de administración automática) es una buena idea también.

Cuestiones relacionadas