Pregunta

Hace un tiempo me uní al nuevo proyecto. Estaba en desarrollo durante bastante tiempo. Lo que me sorprendió fue que todas las contraseñas de los usuarios se almacenan en forma no cifrada .

Le expliqué a nuestra administración grandes vulnerabilidades de seguridad de esto, parece que están de acuerdo con eso y quieren hacer que el proyecto sea más seguro. Los miembros del equipo también están de acuerdo.

Tenemos alrededor de 20K usuarios en el sistema.

En realidad, es bastante estresante hacer que esto funcione: migrar contraseñas no cifradas a una forma cifrada . Si algo sale mal, puede llevar al desastre del proyecto.

¿Cómo puedo reducir este estrés? ¿Apoyo? Pruebas unitarias (pruebas integracionales)?

¿Fue útil?

Solución

Bueno, tenga cuidado con su copia de seguridad porque contendrá contraseñas de usuario no cifradas :-)

Suponiendo que las contraseñas se almacenan en una base de datos, una solución fácil sería algo como esto:

1) Haga una copia de seguridad segura de todos los datos de la tabla

2) Crear una nueva columna (Contraseña encriptada o nombre similar)

3) Use una consulta de ACTUALIZACIÓN para actualizar la nueva columna de cada fila con un MD5 de la contraseña sin cifrar mientras usa un sal de 32 bytes o más. Casi todos los sistemas de bases de datos de hoy tienen una función MD5, por lo que ni siquiera tendrá que dejar su indicador de SQL

4) Mantenga la columna de texto sin formato en el ínterin y actualice su aplicación / scripts para que funcionen con la contraseña con sal.

5) Cambie el nombre de la columna de contraseña antigua de texto sin formato para eliminarla temporalmente y probar su aplicación. Si hay algún problema, vuelva al paso 4 y corrija sus errores.

6) Cuando todo funciona correctamente, elimine la columna de contraseña de texto sin formato

7) Aliente a los usuarios a elegir una nueva contraseña ahora que cuenta con algún nivel de seguridad para mitigar los efectos de cualquier ataque anterior que pueda haber tenido éxito.

Otros consejos

¿Qué tipo de proyecto es este? ¿Una aplicación web, una aplicación de escritorio?

Si vas por el camino de refactorización, ¿hay alguna razón por la que las contraseñas deban almacenarse en algo reversible como el cifrado? En general, es una buena práctica codificar sus contraseñas con algo como SHA, luego codificar la entrada con el mismo algoritmo y comparar los resultados. Solo almacenas los valores hash, no las contraseñas reales. Esto le brinda la posibilidad de verificar que alguien haya ingresado la contraseña correcta sin exponer a los usuarios a la posibilidad de que se rompa su cifrado y se expongan sus contraseñas.

La información específica sobre su enfoque no es algo que pueda proporcionar (ya que no sé cómo funciona), pero lo mejor es crear una columna adicional para almacenar las contraseñas con hash, hash con las contraseñas existentes y luego mantener Actualizados con cualquier cambio de contraseña. Utilice esta nueva columna para todos los nuevos desarrollos, luego, una vez que se complete y se pruebe el movimiento, elimine la columna con las contraseñas de texto sin formato.

Escriba muchas pruebas, que prueban muchos casos de esquinas (mayúsculas y minúsculas, números, símbolos, caracteres Unicode, contraseñas largas, etc.). Cuando esté desarrollando y probando, cree un sistema para volver al sistema anterior (al proporcionar la lista de contraseñas antiguas, por supuesto, ya que una vez que las contraseñas están identificadas, no podrá volver a convertirlas directamente). Guarde una copia de la lista de contraseñas actual. Convierta las contraseñas en un archivo de prueba o en una base de datos de prueba, y luego use la copia guardada de las contraseñas para probar que todo funcionó. Ahora mueva el sistema a producción, y asegúrese de que funcione para sus usuarios. Si no lo hace, ya ha probado el plan para migrar nuevamente al sistema anterior. Una vez que se ha demostrado que funciona durante un par de semanas, puede eliminar la lista de contraseñas de cleartext y listo.

Simplemente haría un hash de las contraseñas actuales, las almacenaría en un nuevo campo de base de datos y comenzaría a usar ese campo mientras borraba el campo de contraseña. Luego notificaría a mis usuarios que ahora sería un buen momento para cambiar las contraseñas, ya que ha implementado más mecanismos de seguridad para mantener seguros sus datos.

Para tener una copia de seguridad, simplemente haga SELECT * INTO Backup OF UserData

Puede obtener una mayor confianza ejecutando ambos métodos de autenticación (cifrados y no cifrados) para cada intento de inicio de sesión, y si producen un resultado diferente, reciba un correo electrónico de alerta. Este cambio no es visible para sus usuarios, por lo que puede durar semanas e incluso meses. Una vez que vea que la autenticación anterior y la nueva funcionan para un porcentaje lo suficientemente alto de sus usuarios, desactive la anterior.

Si es posible, puede intentar esto: envíe un correo electrónico a todos sus usuarios para actualizar sus contraseñas con un período de tiempo de espera, después del cual no podrán trabajar si no cambian sus contraseñas. Hash estas nuevas contraseñas y almacenar el hash. Esto requeriría algunos cambios en la interfaz (es decir, los datos que envía).

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