Estoy trabajando en un proyecto que debe tener autenticación (nombre de usuario y contraseña)
También se conecta a una base de datos, así que pensé que almacenaría el nombre de usuario y la contraseña allí. Sin embargo, parece que no es una buena idea tener contraseñas como solo un campo de texto en una tabla ubicada en la base de datos.
Estoy usando C # y me conecto a un servidor express 2008. ¿Alguien puede sugerir (con tantos ejemplos como sea posible) cuál sería la mejor manera de almacenar este tipo de datos?
PD: Estoy abierto a la idea de que esta información no se almacene en la base de datos si se puede proporcionar una buena razón
Respuestas:
Tiene razón en que almacenar la contraseña en un campo de texto sin formato es una idea horrible . Sin embargo, en lo que respecta a la ubicación , para la mayoría de los casos se encontrará (y sinceramente no puedo pensar en ningún contraejemplo) almacenar la representación de una contraseña en la base de datos es lo correcto. Por representación me refiero a que desea descifrar la contraseña utilizando una sal (que debería ser diferente para cada usuario) y un algoritmo seguro de 1 vía y almacenar eso , desechando la contraseña original. Luego, cuando desee verificar una contraseña, debe seleccionar el valor hash (utilizando el mismo algoritmo hash y salt) y compararlo con el valor hash de la base de datos.
Entonces, si bien es bueno que esté pensando en esto y es una buena pregunta, en realidad es un duplicado de estas preguntas (al menos):
Para aclarar un poco más sobre la sal, el peligro con simplemente descifrar una contraseña y almacenarlo es que si un intruso obtiene su base de datos, aún puede usar lo que se conoce como tablas del arco iris para poder "descifrar" el contraseña (al menos las que aparecen en la tabla del arco iris). Para evitar esto, los desarrolladores agregan una sal a las contraseñas que, cuando se hace correctamente, hace que los ataques de arco iris sean simplemente imposibles de hacer. Tenga en cuenta que un error común es simplemente agregar la misma cadena única y larga a todas las contraseñas; Si bien esto no es horrible , es mejor agregar sales únicas a cada contraseña. Lee esto para más.
fuente
Antecedentes Nunca ... realmente ... necesita saber la contraseña del usuario. Solo desea verificar que un usuario entrante conozca la contraseña de una cuenta.
Hash It: almacene las contraseñas de usuario hash (cifrado unidireccional) a través de una fuerte función hash. La búsqueda de "contraseñas de cifrado de c #" ofrece muchos ejemplos.
Consulte el creador de hash SHA1 en línea para obtener una idea de lo que produce una función hash (pero no use SHA1 como función hash, use algo más fuerte como SHA256).
Ahora, una contraseña con hash significa que usted (y los ladrones de bases de datos) no deberían poder revertir ese hash en la contraseña original.
Cómo usarlo: Pero, usted dice, ¿cómo uso esta contraseña mezclada almacenada en la base de datos?
Cuando el usuario inicia sesión, le entregará el nombre de usuario y la contraseña (en su texto original). Simplemente use el mismo código hash para ingresar esa contraseña ingresada y obtener la versión almacenada.
Entonces, compare las dos contraseñas hash (hash de la base de datos para el nombre de usuario y la contraseña escrita y hash). Puede saber si "lo que escribieron" coincide "con lo que el usuario original ingresó para su contraseña" comparando sus valores hash.
Crédito adicional:
Pregunta: Si tuviera su base de datos, ¿no podría simplemente tomar una galleta como John the Ripper y comenzar a hacer hash hasta encontrar coincidencias con sus contraseñas hash almacenadas? (dado que los usuarios eligen palabras cortas de diccionario de todos modos ... debería ser fácil)
Respuesta: Sí ... sí que pueden.
Por lo tanto, debe 'sal' sus contraseñas. Ver el artículo de Wikipedia sobre sal
Consulte el ejemplo de "Cómo hacer hash de datos con sal" C #
fuente
Como un hash salado endurecido con clave, utilizando un algoritmo seguro como sha-512.
fuente
La mejor práctica de seguridad no es almacenar la contraseña (ni siquiera encriptada), sino almacenar el hash salado (con una sal única por contraseña) de la contraseña encriptada.
De esa manera es (prácticamente) imposible recuperar una contraseña de texto sin formato.
fuente
Recomiendo leer los artículos Suficiente con las tablas del arco iris: lo que necesita saber sobre los esquemas de contraseña segura [enlace inactivo , copia en el Archivo de Internet ] y Cómo almacenar una contraseña de forma segura .
Muchos codificadores, incluido yo mismo, creen que entienden la seguridad y el hash. Lamentablemente, la mayoría de nosotros simplemente no lo hacemos.
fuente
Puede que esté un poco fuera de tema, ya que mencionó la necesidad de un nombre de usuario y una contraseña, y mi comprensión del problema no es la mejor, pero ¿OpenID es algo que vale la pena considerar?
Si usa OpenID, entonces no terminará almacenando ninguna credencial si entiendo la tecnología correctamente y los usuarios pueden usar las credenciales que ya tienen, evitando la necesidad de crear una nueva identidad que sea específica para su aplicación.
Sin embargo, puede no ser adecuado si la aplicación en cuestión es solo para uso interno
RPX proporciona una manera fácil y agradable de integrar el soporte de OpenID en una aplicación.
fuente
En su escenario, puede echar un vistazo a la membresía asp.net, es una buena práctica almacenar la contraseña del usuario como una cadena hash en la base de datos. puede autenticar al usuario comparando la contraseña entrante cifrada con la almacenada en la base de datos.
Todo ha sido construido para este propósito, consulte la membresía asp.net
fuente
Me gustaría MD5 / SHA1 la contraseña si no necesita poder revertir el hash. Cuando los usuarios inician sesión, puede cifrar la contraseña dada y compararla con el hash. Las colisiones de hash son casi imposibles en este caso, a menos que alguien obtenga acceso a la base de datos y vea un hash por el que ya tiene una colisión.
fuente