Pregunta

Tengo una base de datos de contraseñas hash que no tenían sal agregada antes de ser hash. Quiero agregar sal a las nuevas contraseñas. Obviamente no puedo re-hash los existentes.

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

¿Fue útil?

Solución

Claro que puedes. Simplemente agregue una sal al hash existente y vuelva a hacerlo. Por supuesto, esto requerirá que los inicios de sesión futuros pasen por el mismo proceso, lo que significa que habrá que llamar a dos funciones hash, pero muchos patrones legítimos lo hacen de todos modos, por lo que no huele tan mal como podría pensar.

Salar una contraseña es un esfuerzo para defenderse de las mesas arcoiris. En este caso, la sal no necesita ser un secreto.

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

Realmente puedes ver en el artículo

hash = MD5 (MD5 (password) . salt)

Cuál es el mismo método exacto que usarías. (Excepto una función hash diferente).

Otros consejos

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

Puede agregar una columna, que consiste en un indicador que muestra si el usuario tiene un hash antiguo (sin sal) o nuevo (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 eventualmente.

Me ocupé de un problema similar relacionado con múltiples técnicas de hashing. También utilicé el enfoque de codificar un tipo de método hash en la base de datos (es decir, 'alfa', 'beta', 'gamma', 'delta'). Marqué todos los hashes actuales con el nivel apropiado. Cuando los usuarios iniciaron sesión, validé sus contraseñas y las realicé usando los métodos actualizados. Nuestras contraseñas caducan después de 90 días, por lo que fue solo una cuestión de esperar 3 meses hasta que todas las contraseñas que utilizaban los métodos anteriores pudieran restablecerse.

Hay algunas formas aquí que pueden trabaja para ti.
Recuerde, cualquier patrón constante que agregue al hash existente es inútil (uno de los trucos en ese enlace está sugiriendo 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 con sal.

Cree un nuevo campo en su base de datos llamada " salada " con un tipo de verdadero / falso (o cualquiera que sea el equivalente en su DBMS). Establezca todos los valores en falso para los hashes existentes. Cada vez que se agregue un hash nuevo, salado, configure el " salado " campo a verdadero.

Entonces, todo lo que tienes que hacer es manejar los dos tipos de hashes de manera diferente en tu código.

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

Si está almacenando la sal dentro del hash, debe ser bastante sencillo determinar si se incluye una sal al verificar la longitud del hash. Si no hay una sal, solo hash la contraseña, si hay una sal, hash la contraseña + sal.

No debería necesitar una columna booleana en su base de datos.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top