¿Sistema de autenticación segura en python?

Estoy haciendo una aplicación web en python y me gustaría tener un sistema de inicio de sesión seguro.

He hecho sistemas de inicio de sesión muchas veces antes al hacer que el usuario inicie sesión y luego se guarda una cadena aleatoria en una cookie que también se guarda junto a ese usuario en una base de datos que funcionó bien pero no era muy segura.

Creo que entiendo los principios de un sistema avanzado como este pero no los específicos:

  • Utilice HTTPS para la página de inicio de sesión y las páginas importantes
  • Hash la contraseña guardada en la base de datos (bcrypt, sha256? Use salt?)
  • Use nonces (encriptado con la página url y ip?)

Pero aparte de estos, no tengo idea de cómo verificar de manera confiable si la persona que inició sesión es realmente el usuario, o cómo mantener las sesiones entre solicitudes de página y varias páginas abiertas de forma segura, etc.

¿Puedo tener algunas instrucciones (preferiblemente específicas, ya que soy nuevo en esta progtwigción avanzada de seguridad)?

Solo estoy tratando de lograr un inicio de sesión de usuario básico en un dominio con seguridad, nada demasiado complicado.

Esta respuesta aborda principalmente el hashing de contraseñas y no sus otras subpreguntas. Para ellos, mi principal consejo sería no reinventar la rueda: use los marcos existentes que funcionan bien con GAE. Ofrece implementaciones integradas de Django, pero también tiene una instalación incorporada de WebOb, por lo que también deben considerarse varios marcos basados ​​en WebOb (Pyramid, Turbogears, etc.). Todos estos tendrán bibliotecas prefabricadas para manejar mucho de esto por usted (por ejemplo: muchos de los marcos WebOb usan Beaker para el manejo de sus sesiones basadas en cookies)


Con respecto al hash de contraseñas … ya que indicó en algunos otros comentarios que está utilizando el motor de aplicaciones de Google, desea utilizar el hash de contraseña SHA512-Crypt .

Las otras opciones principales para almacenar hashes de contraseñas de la forma más segura posible son BCrypt, PBKDF2 y SCrypt. Sin embargo, GAE no ofrece soporte acelerado por C para estos algoritmos, por lo que la única forma de implementarlos es a través de una implementación de python puro. Desafortunadamente, sus algoritmos son demasiado complicados para una implementación de python pura para hacer un trabajo lo suficientemente rápido como para ser seguros y receptivos. Mientras que la implementación de GAE del módulo de cifrado de Python ofrece compatibilidad con SHA512-Crypt acelerada por C (al menos, cada vez que lo he probado), por lo que podría ejecutarse con la suficiente potencia.


En lo que respecta a escribir el código real, puede utilizar el módulo crypt directamente. Tendrá que ocuparse de generar sus propias cadenas de Salt cuando las pase a crypt, y cuando crypt.crypt(passwd, "$6$" + salt) nuevas contraseñas, llame a crypt.crypt(passwd, "$6$" + salt) . El $6$ le dice que use SHA512-Crypt.

Alternativamente, puede usar la biblioteca Passlib para manejar la mayor parte de esto por usted (exención de responsabilidad: soy el autor de esa biblioteca) . Para una rápida implementación de GAE:

 from passlib.context import CryptContext pwd_context = CryptContext(schemes=["sha512_crypt"], default="sha512_crypt", sha512_crypt__default_rounds=45000) # encrypt password hash = pwd_context.encrypt("toomanysecrets") # verify password ok = pwd_context.verify("wrongpass", hash) 

Nota: si se preocupa por la seguridad de la contraseña, haga lo que haga, no use un solo algoritmo HASH (salt + contraseña) (por ejemplo, Django, PHPass, etc.), ya que estos pueden ser forzados de manera brutal.

Es difícil ser específico sin conocer tu configuración. Sin embargo, lo único que no debes hacer es reinventar la rueda. La seguridad es complicada, si a su rueda le falta algo que quizás no sepa hasta que sea demasiado tarde.

No me sorprendería si su marco web incluyera un módulo / biblioteca / complemento para el manejo de usuarios, inicios de sesión y sesiones. Lea su documentación y úsela: es de esperar que haya sido escrito por personas que conocen un poco sobre seguridad.

Si desea saber cómo se hace, estudie la documentación y la fuente de dicho módulo.