La mejor manera de almacenar la contraseña en la base de datos [cerrado]
Estoy trabajando en un proyecto que tiene que tener autenticación (nombre de usuario y contraseña)
También se conecta a una base de datos, así que pensé en almacenar el nombre de usuario y la contraseña allí. Sin embargo, no parece tan buena idea tener contraseñas como solo un campo de texto en una tabla de la base de datos.
Estoy usando C# y conectándome 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.
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 , en la mayoría de los casos que encontrará (y honestamente 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 codificar la contraseña utilizando un salt (que debería ser diferente para cada usuario) y un algoritmo unidireccional seguro y almacenarlo , desechando la contraseña original. Luego, cuando desee verificar una contraseña, aplica el valor hash (usando el mismo algoritmo hash y sal) y lo compara con el valor hash en la base de datos.
Entonces, si bien es bueno que estés pensando en esto y es una buena pregunta, en realidad es un duplicado de estas preguntas (al menos):
- Cómo almacenar mejor la información del usuario y el inicio de sesión y la contraseña del usuario
- Mejores prácticas para almacenar contraseñas de bases de datos
- Salar su contraseña: ¿mejores prácticas?
- ¿Alguna vez está bien almacenar la contraseña en texto sin formato en una variable de PHP o una constante de PHP?
Para aclarar un poco más el tema de la sal, el peligro de simplemente codificar una contraseña y almacenarla es que si un intruso se apodera de su base de datos, aún puede usar lo que se conoce como tablas arcoíris para poder "descifrar" la contraseña (al menos aquellas que aparecen en la tabla del arco iris). Para solucionar esto, los desarrolladores agregan sal a las contraseñas que, cuando se hace correctamente, hace que los ataques arcoíris sean simplemente inviables. 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. Lea esto para obtener más información.
Antecedentes Usted 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 los usuarios en formato hash (cifrado unidireccional) mediante una función hash potente. Una búsqueda de "c# cifrar contraseñas" proporciona una gran cantidad de ejemplos.
Consulte el creador de hash SHA1 en línea para tener una idea de lo que produce una función hash (pero no use SHA1 como función hash, use algo más potente 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 a la contraseña original.
Cómo usarla: Pero, usted pregunta, ¿cómo uso esta contraseña combinada 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 codificar la 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 ingresada y hash). Puedes saber si "lo que escribieron" coincide con "lo que el usuario original ingresó como contraseña" comparando sus hashes.
Crédito adicional:
Pregunta: Si tuviera su base de datos, ¿no podría simplemente tomar un cracker como John the Ripper y comenzar a hacer hashes hasta que encuentre coincidencias con sus contraseñas hash almacenadas? (dado que los usuarios eligen palabras cortas del diccionario de todos modos... debería ser fácil)
Respuesta: Sí... sí pueden.
Por lo tanto, deberías "salar" tus contraseñas. Ver el artículo de Wikipedia sobre la sal.
Consulte el ejemplo de C# "Cómo aplicar hash a datos con salt" (archivado)
Como hash salado endurecido con clave, utilizando un algoritmo seguro como sha-512.
La mejor práctica de seguridad es no almacenar la contraseña en absoluto (ni siquiera cifrada), sino almacenar el hash salado (con una sal única por contraseña) de la contraseña cifrada.
De esa manera es (prácticamente) imposible recuperar una contraseña en texto plano.
Recomiendo encarecidamente leer los artículos Ya basta de tablas arcoíris: lo que necesita saber sobre los esquemas de contraseñas seguras [enlace inactivo, copia en Internet Archive ] y Cómo almacenar una contraseña de forma segura .
Muchos programadores, incluido yo mismo, creemos que entienden la seguridad y el hashing. Lamentablemente, la mayoría de nosotros simplemente no lo hacemos.