2011-11-14 16 views
5

Tengo un proyecto y aparentemente los diseñadores del software no tuvieron en cuenta la seguridad.T-SQL Encriptación vs Hashing/Salting para iniciar sesión en los usuarios del sitio web

Las contraseñas se almacenan en texto sin formato y se transmiten a través de texto sin formato. Así que me quedé con la tarea de arreglar esto.

Estoy un poco oxidado en cuanto a la seguridad, entonces mi pregunta es: ¿para la autenticación de contraseña de usuario en línea es mejor usar técnicas de hash/salazón o es mejor usar el cifrado AES? ¿Podría tener los pros y los contras?

¿Sería mejor utilizar de alguna manera el proveedor de membresía de ASP.NET? ¿Esto sería fácil de hacer? Lo he usado antes, pero el software necesita sus propias tablas, así que no estoy seguro de si eso es más problemático.

Si se ha respondido esto podría alguien dirigirme allí, porque no he encontrado una comparación.

Respuesta

8

NUNCA debe almacenar contraseñas utilizando cifrado simétrico.

Sal al azar para cada usuario, hash su contraseña, almacenar tanto la sal como el hash en la base de datos. Luego, en las solicitudes de inicio de sesión obtienes al usuario por correo electrónico/nombre de usuario/id, etc., luego usa la sal vinculada a ese usuario y hash la contraseña proporcionada y luego compárala con el hash almacenado. Si coincide, inicie sesión, en caso contrario, contraseña incorrecta.

Si usa el proveedor de membresía ASP.NET integrado, debería hacer esto por usted.

+0

La respuesta que necesitaba gracias. En la nota de la membresía de asp.net: el software no lo usó (lo que explica el dolor de cabeza). Estaba revisando las tablas y creo que la mejor solución sería simplemente agregar una nueva columna para el ID de usuario aspmembership. – pqsk

+0

Tenga en cuenta que agregar una nueva columna para el ID de usuario de aspmembership no evita la maldad que menciono en [mi respuesta] (http://stackoverflow.com/questions/8123382/t-sql-aes-encryption-vs-hashing-salting-for -logging-in-users-to-website/8123808 # 8123808), aunque le da opciones sobre exactamente qué tipo de fealdad cambiará el nombre de usuario introducirá. – Brian

1

Le sugiero que multiplique en hash una contraseña predeterminada. Más de 10 veces o algo. Entonces, ¿por qué? Porque para usted, una contraseña salada no tardará mucho más. Pero para un tipo malvado que intenta diferentes combinaciones para obtener una contraseña bruta, toma 10 veces más de tiempo cada intento. Y no puede estar seguro si lo hizo 10 o 1000 veces.

Utilizo esto personalmente como un aumento de seguridad económico.

Ver aquí: Stackoverflow Salting Your Password: Best Practices?

o hay Secure hash and salt for PHP passwords

Buena suerte :)

Harry

-2

Depende de si desea o no ser capaz de recuperar una contraseña de usuario para alguna operación. Si usa hash/salazón, eso significa que cada vez que un usuario olvida su contraseña, tendrá que hacer que la aplicación genere una nueva contraseña segura. Si usa el cifrado simétrico, al menos le brinda al usuario la posibilidad de recuperar su contraseña existente y cambiarla más adelante según su conveniencia.

No puedo responder si hay o no una mayor seguridad en ambos sentidos. Alguien con más conocimiento que el que tendré que responder es si es más o menos factible descifrar un algoritmo de hash/salazón en lugar de un algoritmo de cifrado simétrico. En la superficie, el hash/salazón parece ser más seguro porque el atacante tiene que descifrar el algoritmo antes de que pueda comenzar a descifrar las contraseñas. Pero lo mismo podría decirse si decidió usar un algoritmo de encriptación simétrico diferente. También podría combinar algoritmos de clave simétrica en caso de que piense que AES no es lo suficientemente seguro por sí mismo.

+1

Hashing/salazón es más seguro porque no está almacenando la contraseña. Alguien que piratee su servidor no podrá ejecutar una función mágica para extraer todas las contraseñas de los usuarios (y luego usarlas en otros servidores) ... aunque podrán descifrar las contraseñas "comunes" (claro, hay son varias contraseñas que comparten un hash con "Contraseña1", pero es probable que el usuario esté usando "Contraseña1"). – Brian

+2

-1 para defender el acceso a las contraseñas. Esta es una violación de seguridad extrema, si me da un par de cientos de correos electrónicos y contraseñas de un sistema de inicio de sesión real (tal vez un par de miles) encontraré por lo menos 1 cuenta de PayPal en funcionamiento con esa información. Hashing está destinado a proteger las contraseñas comprometidas tanto por un usuario malintencionado que piratea su sistema como por un administrador de sistema malicioso que ya tiene acceso. –

+0

@Brian Usted hace un buen caso para usar hash en ese sentido. Sin embargo, significa que la contraseña existente nunca podría recuperarse. Sé que en algunos sistemas encriptan aún más la información basada en la sal utilizada en la contraseña del usuario, lo que hace que sea más imposible acceder a la información sobre el usuario si el usuario olvidó su contraseña. Pero eso no es ni aquí ni allá. Supongo que realmente solo depende de la aplicación. – villecoder

1

El uso de la membresía no debería suponer una gran dificultad para hacer todo usted mismo, y es probable que sea más seguro.Simplemente use el nombre de usuario existente del usuario como nombre de usuario de membresía, obligue a los usuarios a restablecer sus contraseñas (corregir el sistema de seguridad requerirá que elimine contraseñas viejas independientemente), y cambie todos los enlaces que verifiquen quién usará el usuario Membership.GetUser() o similar.

Habrá un poco de maldad si admite la capacidad de cambiar los nombres de usuario. Cambiar un nombre de usuario puede introducir un agujero de seguridad si no se hace con cuidado ya que la membresía depende de los nombres de usuario y de los usuarios de maneras que podrían causar agujeros (aunque esto requiere que un usuario no malicioso cambie su propio nombre, por lo que no es un gran vacío).

+0

¿Podría explicar las preocupaciones de seguridad con el proveedor de membresía si los usuarios pueden cambiar su nombre de usuario? –

+0

@ChrisMarisic: el proveedor de membresía no proporciona soporte incorporado para cambiar el nombre de usuario. Alguien más que de alguna manera sabe que está cambiando su nombre de usuario puede cambiar su nombre de usuario a su antiguo nombre de usuario.Luego, cuando intentan acceder a la información, el sistema puede devolver su información de manera incorrecta. Básicamente, una vez que unes dos elementos de información de identificación, debes asegurarte de que permanezcan completamente sincronizados, no solo dentro de la base de datos sino también dentro de los cachés (y posiblemente deban restablecer los datos de la sesión). AspNet no hará esto por usted. – Brian

+0

@ChrisMarisic: Además, hay 3 datos potencialmente sincronizables, ya que el OP debe usar su propio control de inicio de sesión o mantener el nombre de usuario de los usuarios dentro de su sistema de cuentas existente sincronizado con su nombre de usuario dentro de la membresía. – Brian

Cuestiones relacionadas