¿El siguiente conjunto de pasos, lo suficientemente seguro, durante el registro e inicio de sesión en mi aplicación web? [cerrado]

0

Registrarse:

  1. Se comparan ambos cuadros de texto de la contraseña ingresada por el usuario, si coinciden:
  2. Agregue el correo electrónico del usuario a la tabla [usuarios] en la base de datos, para tener una identificación de usuario para luego grabar todo.
  3. Crea sal. Todo lo suficientemente aleatorio, y lo suficientemente complejo será suficiente. Nombre de usuario + fecha actualTiempo - hash MD5. GUID, nombre de usuario + número aleatorio con hash, etc.
  4. Registre la sal en una tabla Salt en la base de datos junto con el ID de usuario y el nombre.
  5. Agregue la contraseña y la sal del usuario.
  6. Hash que usa Encryption1
  7. Hash que usa Encryption2
  8. Registre que, junto con la identificación del usuario y sus detalles (si corresponde) que proporcionaron en el formulario de registro.
  9. Se envió una verificación de correo electrónico opcional para asegurarse de que están usando un correo electrónico legítimo.

Iniciar sesión.

  1. Obtenga la sal utilizando el nombre de usuario ingresado por el usuario.
  2. Si se devuelve sal, realice los pasos 5-7 del registro (pwd + salt, hash, hash)
  3. Cuando recuperamos la sal, también obtuvimos una ID de usuario, comparamos el resultado del Paso 2 y la ID con los registros en la base de datos.
  4. Si hay una coincidencia, el usuario usó su correo electrónico y contraseña y puede iniciar sesión.
  5. Cree una variable de sesión y permita que continúen.

Un beneficio que creo que todo esto conlleva es que, incluso si se accede a toda mi base de datos de forma completamente desprotegida, la contraseña es una cadena de 50 caracteres con doble hash que utiliza métodos de cifrado diferentes.     

pregunta Иво Недев 01.11.2017 - 10:14
fuente

2 respuestas

2

Siguiendo tu ejemplo, solo voy a enumerar mis pensamientos:

  1. Asegúrese de que la dirección de correo electrónico no esté en uso
  2. Para ser claros, el algoritmo de hash MD5 no agrega aleatoriedad a nada. Como resultado, aquí realmente no hace mucho por ti, aparte de que no es evidente de inmediato de dónde proviene la sal. Creo que sería mejor usar un CSPRNG para generar su sal que basándolo en los datos del usuario y ejecutándolo a través de MD5 .
  3. Esta es una aplicación nitpick, pero parece que está creando el registro de usuario (paso 2) y luego regresa y almacena la sal (paso 4) y luego almacena la contraseña con hash (paso 8). No hay razón para que no pueda hacer todo eso en una operación de inserción. Obtendrá un mejor rendimiento, pero lo más importante es que su código será más simple y fácil de mantener.
  4. Para ser claros, no desea utilizar un método de cifrado para cifrar sus contraseñas. El hash y el cifrado son dos conceptos separados con diferentes algoritmos preferidos. Asegúrate de que hash: no está encriptando. Por lo que ha escrito, creo que está en la página correcta y simplemente está utilizando la terminología incorrecta. Es un error fácil de cometer, pero la diferencia es lo suficientemente crítica como para que valga la pena señalarlo.
  5. No hay una buena razón para usar dos algoritmos de cifrado separados. La única razón para hacer tal cosa es hacerlo para que las personas no puedan intentar forzar sus contraseñas si encuentran su base de datos. Sin embargo, es una medida de seguridad que se basa en que su código fuente se mantenga en secreto. A veces ambos se filtran sin embargo. Este paso no es inútil , pero tampoco es tan útil como podría pensar, y complica su código. Si desea una protección como esta, solo incluiría un pepper y me apegaría a una sola pasada de un hashing de contraseña seguro algoritmo.
  6. Al iniciar sesión, asegúrate de devolver un solo mensaje de error no descriptivo al usuario "Combinación de nombre de usuario / contraseña no válida"
  7. No haga una comparación simple de la contraseña con hash del usuario con lo que sale de la base de datos (es decir, $hashed_input == $user_hash ). Hay algunas formas sutiles en las que un atacante malicioso puede usar una comparación tan sencilla para ayudar a descifrar las contraseñas. Algunos idiomas tienen métodos de ayuda para facilitar comparaciones de hash de contraseñas. Usa uno o encuentra uno.

Puede haber una gran cantidad de formas sutiles para que los errores de seguridad se introduzcan en el sistema de inicio de sesión de una aplicación, que se puede perder fácilmente en una descripción general como esta. Teniendo en cuenta que es la primera línea de defensa de su aplicación, es importante obtener la autenticación del usuario correcta. Como resultado, lo mejor que puede hacer es utilizar un módulo de autenticación bien probado y con un buen soporte que ya exista, en lugar de crear uno propio. Si decide seguir escribiendo su propia cuenta, al menos debe publicar su código en codereview.stackexchange.net después.

    
respondido por el Conor Mancone 01.11.2017 - 11:03
fuente
2

Algunas notas, si no una respuesta completa:

  1. NO use un hash simple como SHA-x para su (s) hash (es) de contraseña. DEBES usar un hash lento diseñado para el almacenamiento de contraseñas.
  2. Si usas correctamente un hash de contraseña, tu doble hash no agrega mucho a la seguridad. De hecho, es mejor que te sirvan mejor simplemente incrementando la cantidad de rondas de hash de tu contraseña.
  3. Si la dirección de correo electrónico es requerida para usar su sistema, o si la dirección de correo electrónico se usa para restablecer la contraseña, yo haría la verificación de correo electrónico requerida en lugar de opcional. De lo contrario, los usuarios malintencionados podrían registrar otras personas (o impedir que otras personas creen una cuenta), y los usuarios legítimos podrían escribir su dirección de correo electrónico para que otra persona pueda obtener el control de su cuenta por accidente.
respondido por el Ben 01.11.2017 - 16:11
fuente

Lea otras preguntas en las etiquetas