2009-07-29 34 views
12

Tengo una base de datos de contraseñas hash que no tuvieron sal añadida antes de que fueran hash. Quiero agregar sal a las contraseñas nuevas. Obviamente no puedo volver a codificar los existentes.¿Cómo agregarías sal a tus hashes de contraseña existentes?

¿Cómo migraría a un nuevo sistema hash?

+0

¿Realmente tiene contraseñas hash, o algo más complejo? Debido a un error de codificación, estoy en un bote similar, pero el código original efectivamente tiene "1" + nombre de usuario + "" + contraseña, que es lo suficientemente complejo como para hacer que las tablas de arcoiris no sean factibles (especialmente porque el nombre de usuario no es usuario) seleccionado). –

+0

Estaba cifrando la contraseña directamente. Parece que ya has agregado la sal. Tu camino parece bueno porque además de la sal, las contraseñas que son iguales no tendrán el mismo hash porque estás agregando el nombre de usuario. –

Respuesta

31

Claro que puedes. Solo agrega una sal al hash existente y hash nuevamente. Por supuesto, esto requerirá que cualquier inicio de sesión futuro atraviese el mismo proceso, lo que significa que se necesitarán dos funciones de hash, pero muchos patrones legítimos lo hacen de todos modos para que no huela tan mal como podría pensar.

Saltear una contraseña es un esfuerzo para defenderse de las tablas de arcoíris. En este caso, la sal no necesita ser un secreto.

http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables

En realidad se puede ver en el artículo

hash = MD5 (MD5 (password) . salt) 

¿Qué es exactamente el mismo método que estaría utilizando. (Excepto una función hash diferente.)

+0

+1 - Me gusta más de lo que estaba pensando –

+0

Interesante idea. Sin embargo, ¿estás seguro de que no obstaculiza la seguridad de alguna manera? Especialmente que de esta manera, una persona que obtiene las cuerdas después del segundo hash tendrá mucha información sobre el paso anterior (como la longitud constante, por ejemplo), que podría permitirle ayudarlo a encontrar la sal. –

+3

Las sales no son secretos. De hecho, debe guardarlos (en texto plano) junto con cada usuario. –

2

Se podría añadir una columna, que consiste en una bandera que indica si el usuario tiene una edad (sin sal) o un hash nueva (con sal).

Una buena idea es, en ese momento, obligar a todos los usuarios a cambiar sus contraseñas al iniciar sesión. De esta forma, puede deshacerse de esa columna con el tiempo.

+0

o tener la columna como hash_type (nosalt, md5, sha1, sha512). Si es 'nosalt', haga una cosa, si hay otras, hay una columna de sal usada y almacenada en otra parte de la fila para usar en la comparación, con la función hash apropiada cuando vaya a actualizarla (ya que MD5 ya parece más débil) –

14

Como solución rápida, puede crear una columna de sal en la base de datos, y cuando un usuario inicia sesión correctamente, puede usar la contraseña que ingresó con un valor salt y crear un nuevo hash.

+0

ooo, eso suena como una muy buena idea –

+0

Este sería mi enfoque también. La refactorización definitivamente extiende el código pasado y puede, de hecho, * las necesidades *, hacerse en el nivel de la base de datos, también. –

+0

+1, esquema excelente. – nik

0

Hay some ways here que pueden funcionar para usted.
Recuerde, cualquier patrón constante que agregue al hash existente es inútil (uno de los trucos en ese enlace sugiere algo así). No debe haber un patrón identificable que pueda usarse para aislar la sal.

Por supuesto, la mejor manera sería migrar a una tabla hash salada.

0

Crea un nuevo campo en tu base de datos llamado "salado" con un tipo de verdadero/falso (o lo que sea el equivalente en tu DBMS). Establezca todos los valores en falso para los hashes existentes. Siempre que se agregue un hash nuevo, salado, establezca el campo "salado" en verdadero.

Luego, todo lo que tiene que hacer es manejar los dos tipos de valores hash de manera diferente en su código.

Esto es más una solución general que una específica, pero debería resolver su problema.

0

Si está almacenando la sal dentro del hash, debería ser bastante sencillo determinar si se incluye una sal comprobando la longitud del hash. Si no hay sal, solo hash la contraseña, si hay sal, hash la contraseña + salt.

No necesita una columna booleana en su base de datos.

0

La mejor manera de almacenar mi sal es que incorporo el valor de sal dentro de la contraseña hash + salt que acabo de crear. No agrego la cadena de sal al principio o al final del hash, literalmente incrusto la sal en el hash.

+0

¿No es así como se supone que se usa una sal? Para estar seguro de que no te estoy malinterpretando, ¿te refieres a hash (salt + password)? – Gary

1

He tratado un problema similar que implica varias técnicas de hashing. Utilicé el método de codificación de un método hash también en la base de datos (es decir, 'alfa', 'beta', 'gamma', 'delta'). Marqué todos los hashes actuales con el nivel apropiado. A medida que los usuarios iniciaban sesión, validaba sus contraseñas y las actualizaba utilizando los métodos actualizados. Nuestras contraseñas caducan después de 90 días, por lo que solo era cuestión de esperar 3 meses hasta que se pudieran restablecer todas las contraseñas que usaban los métodos anteriores.

Cuestiones relacionadas