2010-12-14 9 views
76

¿Cuál sería un factor de trabajo de brypt ideal para hash de contraseñas?Factor de trabajo de brypt óptimo

Si utilizo un factor de 10, se necesita aproximadamente .1 para configurar una contraseña en mi computadora portátil. Si terminamos con un sitio muy ocupado, eso se convierte en una gran cantidad de trabajo simplemente revisando las contraseñas de las personas.

Quizás sería mejor usar un factor de trabajo de 7, reduciendo el trabajo total de hash de contraseñas a aproximadamente .01s por laptop-login?

¿Cómo se decide la compensación entre la seguridad de la fuerza bruta y el costo operativo?

+7

El costo frustra los ataques fuera de línea. Cuando está "en línea", puede usar una demora mínima entre intentos (por ejemplo, 5 segundos) para evitar un ataque de denegación de servicio. –

+3

Duplicado en InformationSecurity: [Número recomendado de rondas para bcrypt] (http://security.stackexchange.com/q/17207/46416) –

+1

Para cualquier persona interesada, acabo de escribir una pequeña herramienta CLI de Java para probar el rendimiento de bcrypt en los servidores (que obviamente es importante para equilibrar la seguridad, la carga del servidor y los tiempos de respuesta): https://github.com/cdraeger/hash-performance – Blacklight

Respuesta

96

Recuerde que el valor se almacena en la contraseña: $2a$(2 chars work)$(22 chars salt)(31 chars hash). No es un valor fijo.

Si encuentra que la carga es demasiado alta, solo haga que la próxima vez que inicien sesión, críptice algo más rápido para calcular. Del mismo modo, conforme pasa el tiempo y obtener mejores servidores, si la carga no es un problema, puede actualizar la fuerza de su picadillo de cuando inician sesión.

El truco es mantenerlo teniendo aproximadamente la misma cantidad de tiempo para siempre en el futuro junto con la Ley de Moore. El número es log2, de modo que cada vez que las computadoras dupliquen su velocidad, agregue 1 al número predeterminado.

Decidir cuánto tiempo quiere que lleve una fuerza bruta la contraseña de un usuario. Para una palabra de diccionario común, por ejemplo, la creación de su cuenta probablemente ya les advirtió que su contraseña era débil. Si es una de las 1000 palabras comunes, por ejemplo, y toma un atacante 0.1s para probar cada una, que las compra 100 (bueno, algunas palabras son más comunes ...). Si un usuario elige 'palabra de diccionario común' + 2 números, eso es más de dos horas. Si su base de datos de contraseñas está comprometida y el atacante solo puede obtener unos cientos de contraseñas por día, habrá comprado la mayoría de sus usuarios horas o días para cambiar sus contraseñas de manera segura. Es una cuestión de comprarles tiempo.

http://www.postgresql.org/docs/8.3/static/pgcrypto.html tiene algunas veces para descifrar contraseñas para que considere. Por supuesto, las contraseñas que enumeran allí son letras aleatorias. Palabras de diccionario ... Prácticamente hablando, no puede guardar al tipo cuya contraseña es 12345.

+6

Esta es realmente una excelente respuesta. Ni siquiera había considerado la idea de volver a encriptar en el inicio de sesión. Muchas gracias! – Chris

+1

¿Cómo funcionaría el recrypt? Tendría que almacenar el viejo costo de trabajo bcrypt en algún lugar para que pueda usarlo para iniciar sesión y luego, después de validar su contraseña, ¿actualizará el hash y el costo en la base de datos? –

+4

@JerrySaravia La belleza de bcrypt es que el costo se almacena dentro del mismo hash, por lo que no es necesario almacenar _algo_ extra. Simplemente autentifíquese con el hash actual, luego vuelva a generar inmediatamente el hash con un costo diferente. ¡Sencillo! –

Cuestiones relacionadas