Estoy interesado en cómo los sitios web protegen las contraseñas. Sé que usan algoritmos hash. Hice un programa simple que demuestra cómo creo que “básicamente” lo hacen. ¿Es correcto? Si no, ¿qué no es correcto?

Tienes la idea básica, pero hay algunas más que necesitas agregar.

Uno es el concepto de sal. La sal es un número aleatorio asociado con cada cuenta de usuario. Cuando hash la contraseña, hash la contraseña más la sal. De esa manera, el atacante no puede construir una tabla de contraseñas pre-hash y mirar a través de su base de datos de contraseñas. Simplemente genere una nueva sal para cada usuario cuando se registre.

Además, deseará utilizar un algoritmo hash diseñado intencionalmente para ser muy lento. Solía ​​ser que las computadoras no podían probar millones de contraseñas en poco tiempo, pero hoy en día sí pueden. Prueba bcrypt en lugar de SHA256.

Consejos de Python: no es necesario “borrar la contraseña” al final del registro (). Todas las variables locales (incluidas las variables pasadas) se liberan cuando vuelve la función.

Su método de inicio de sesión define “self.loginProtectedPassword” que no necesita persistir más allá del método login (). Simplemente use “loginProtectedPassword” o lo que quiera.

[Divulgación: trabajo para AgileBits, los creadores de 1Password. Tengo algunas opiniones muy fuertes sobre hashing de contraseñas.]

No ruedes el tuyo

Es fantástico que esté interesado en comprender cómo funciona esto, pero para un sistema real, no utilice su propio esquema de hash de contraseña .

Además de la importancia de una salazón adecuada, como Jonathan Gardner señaló en su respuesta, es importante usar un “hash lento” que esté específicamente diseñado para el hash de contraseñas.

Actualmente hay tres opciones razonables para los esquemas de hash de contraseña. PBKDF2, scrypt y bcrypt.

Passlib parece razonable

Echando un vistazo a la documentación de Passlib 1.6.2, veo que tiene soporte para bcrypt y para PBKDF2. Le recomendaría que use passlib.hash.bcrypt_sha256 o passlib.hash.pbkdf2_digest.

Lo bueno de Passlib es que se encargará automáticamente de generar sales y establecer el parámetro de redondeos para cosas como PBKDF2 o bcrypt. Lo inquietante al respecto es que ofrece una serie de esquemas de hash que nunca deberían usarse.

Aunque parece que las bibliotecas de Python para scrypt, exigen una mayor responsabilidad por la salazón y el establecimiento de varios parámetros, por lo que mi recomendación es seguir con Passlib.

Más allá de los esquemas actuales de hashing de contraseñas

PBKDF2, bcrypt y scrypt son enormemente mejores que los tipos de esquemas que se usan comúnmente, pero cada uno tiene sus peculiaridades. He hablado sobre un problema con PBKDF2 que puede surgir en casos raros:

Pero ese problema en particular no es algo importante para su uso.

Si está interesado en saber qué esfuerzos se están haciendo para desarrollar un sucesor, eche un vistazo a la Competencia de hash de contraseña

Actualizar

Steve Thomas, que sabe muchísimo sobre descifrar contraseñas, no está de acuerdo con mi afirmación de que el problema que discutí en mi charla no importa para su uso. En este tweet escribió

@jpgoldberg “Pero ese problema en particular no es algo importante para su uso de [PBKDF2]”. Sí, lo hace: https://t.co/5guGjsTFFY

Él y yo podemos estar hablando de cosas ligeramente diferentes (aunque cuando no estoy de acuerdo con él, he aprendido a esperar que yo sea el que está equivocado). Y él hace un caso convincente contra el uso de PBKDF2-SHA1 para el hash de contraseña:

¿Quién pensó que “PBKDF2_SHA1 (pw, salt, 1000, 256)” es una buena idea?
Porque los crackers de CPU van a:

  • Verificar los primeros 160 bits te hace 2 veces más rápido que el defensor.
  • SSE2 te hace 4 veces más rápido que el defensor.
  • El HMAC en caché te hace 2 veces más rápido que el defensor (esto podría usarse).
  • AVX2 (q2 2013) le dará otros 2 veces más rápido que el defensor.

Luego están las GPU …
También 1000 fue el mínimo recomendado hace 12 años.

(de: Soporte para nuevas prácticas de almacenamiento de contraseñas ASP.NET)

More Interesting

Como segundo año CS interesado en calificar para pasantías y estoy interesado en ciencia de datos y ML, ¿debería centrarme en ellos ahora, o en programación competitiva y matemáticas discretas, o MOOC de algoritmos, o hacer proyectos?

Soy un senior en ascenso. Planeo tomar AP Physics 2, AP Literature y AP Calculus AB. Planeo especializarme en arquitectura. ¿Debo tomar AP Chem?

Mi puntaje de CSR es 294, ¿debo solicitar la entrada expresa para Canadá?

Soy un conservador fiscal que no quiere votar por Trump. ¿Hay alguna razón por la que quiera votar a favor de Hillary y no solo en contra de Trump?

Me siento tan mal y bajo, ¿qué debo hacer?

Quiero invertir en Ola Cabs. ¿Cuáles son las formalidades legales? ¿Dónde encuentro un conductor y cómo puedo entregarle mi automóvil?

Tengo mucha curiosidad sobre la religión del sijismo. ¿Cómo es la vida diaria para un seguidor tradicional de las enseñanzas sijismo? ¿Las ceremonias y rituales ocupan una gran parte del día? Fuera de la India, ¿dónde están las principales ciudades donde se pueden encontrar templos / lugares de culto sij?

Tengo una PC vieja en el trabajo y me está volviendo loco. He pedido una nueva pero no he recibido una respuesta positiva. Estaba pensando en desactivarlo de alguna manera, pero quiero que parezca un accidente. ¿Como podría hacerlo?

He planeado tomar otras clases de idiomas. ¿En qué idioma puedo optar?

Soy un gran idiota, un fracaso y un chico bueno para nada. ¿Por qué debería vivir?