Cifrado: ¿Cuál es la mejor manera de almacenar nombre de usuario y contraseña en una base de datos?

Aparte de la respuesta de Bill aquí está la toma de mí.

  1. Siempre recurra al hash de la contraseña sin procesar que utiliza el usuario al registrarse.
  2. Hash la contraseña con sal. La sal es una cadena aleatoria que se deriva criptográficamente para la unicidad. Tengo muchas opciones en .NET, pero no sé nada sobre otras bibliotecas para otros idiomas.
  3. Almacene la sal en la tabla de la base de datos en una columna. Necesita esta sal para poder verificar un intento de inicio de sesión. (hash => contraseña + sal de la base de datos en comparación con la contraseña de la base de datos). Si son iguales, tiene la contraseña correcta. Continúe y redirija al usuario a otras páginas.
  4. Use una sal razonablemente grande para complicar el proceso para un hacker. La longitud depende de la importancia de la información de datos para usted.
  5. Habilite el registro y las transacciones para que tenga todos los datos en caso de que ocurra algo terriblemente malo.

Ahh y lo olvidé: nunca recurras a algo como lo siguiente, pensando que tienes un mecanismo de contraseña seguro.

SHA (MD5 (bcrypt (hash (contraseña + salt))) Siempre manténgalo simple.

bcrypt (contraseña + sal)

Las respuestas anteriores a esta pregunta fueron muy buenas, pero quiero asegurarme de enfatizar dos cosas. Cuando se trata de almacenar contraseñas con hash, siempre use SALT (pepper es opcional :). La razón es porque si solo usa una función hash, alguien podría usar una tabla de arcoíris para romper contraseñas cortas o comunes. La segunda cosa que recomendaría es que nunca, jamás, inventes tu propia forma de hacerlo. Use algo como bcrypt o alguna otra biblioteca que haya sido completamente probada y examinada. ¿Por qué? Los sistemas criptográficos son difíciles de crear. Sugeriría leer http://www.schneier.com/blog/arc … para dar una perspectiva.

El método que se considera mejor en estos días es una función de derivación de clave que toma el tiempo suficiente para calcular la contraseña de manera que sea rápido para que un solo usuario inicie sesión o cambie su contraseña, pero demasiado lento para que un atacante haga millones de intentos en rompiéndolo.

Ejemplos incluyen:

Lo más importante que debe recordar aquí es que no debe recopilar nombres de usuario y contraseñas como lo hace Pokemon porque en el momento en que almacenamos la contraseña de un usuario, también asumimos la responsabilidad de asegurar su contraseña.

Incluso si los hackers tienen nuestra tabla de nombre de usuario y contraseña, estamos cubiertos, ¿verdad? Todo lo que verán es el valor hash. Solo los desarrolladores más incompetentes realmente almacenarían la contraseña como texto sin formato en la base de datos, ¿verdad? ¿Correcto?

Incorrecto.

La mayoría de los usuarios tienden a reutilizar las mismas contraseñas, probablemente porque no pueden recordar las dos docenas de nombres de usuario y contraseñas únicas que se ven obligados a tener. Entonces, si obtiene la contraseña de su foro, es probable que también tenga la contraseña de algo mucho más peligroso: la banca en línea y PayPal.

Por lo tanto, podemos hacer lo siguiente:

  • No invente su propio esquema inteligente de almacenamiento de contraseñas. Las vulnerabilidades de seguridad, a diferencia de los errores de funcionalidad en su aplicación, se ejecutan de manera profunda y silenciosa. Pueden permanecer latentes durante años.
  • Nunca almacene contraseñas como texto sin formato. Esto se siente como seguridad 101 y es completamente obvio. Almacene los hashes, nunca las contraseñas reales. Eduque a sus desarrolladores.
  • Agregue una sal aleatoria larga y única a cada contraseña que almacene. Esto te hará inmune al ataque de la mesa arcoiris.
  • Use un hash criptográficamente seguro. SHA-2 o Bcrypt es una mejor opción que MD-5.