Buscando almacenar nombres de usuario y contraseñas en una base de datos, y me pregunto cuál es la forma más segura de hacerlo. Sé que tengo que usar una sal en alguna parte, pero no estoy seguro de cómo generarla de forma segura o cómo aplicarla para encriptar la contraseña. Algunos ejemplos de código Python serían muy apreciados. Gracias.El método más seguro de Python para almacenar y recuperar contraseñas de una base de datos
Respuesta
Almacenar la contraseña + sal como un hash y la sal. Eche un vistazo a cómo lo hace Django: basic docs y source. En el db almacenan <type of hash>$<salt>$<hash>
en un solo campo char. También puede almacenar las tres partes en campos separados.
La función para establecer la contraseña:
def set_password(self, raw_password):
import random
algo = 'sha1'
salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
hsh = get_hexdigest(algo, salt, raw_password)
self.password = '%s$%s$%s' % (algo, salt, hsh)
El get_hexdigest es sólo un envoltorio fino alrededor de algunos algoritmos de hash. Puedes usar hashlib para eso. Algo así como hashlib.sha1('%s%s' % (salt, hash)).hexdigest()
Y la función de comprobar la contraseña:
def check_password(raw_password, enc_password):
"""
Returns a boolean of whether the raw_password was correct. Handles
encryption formats behind the scenes.
"""
algo, salt, hsh = enc_password.split('$')
return hsh == get_hexdigest(algo, salt, raw_password)
¿Tiene un enlace al archivo de código apropiado? –
Esto fue realmente útil. Muchas gracias. – ensnare
@justin ethier: ya está. @ensnare: siéntase libre de marcarlo como aceptado ;-) –
creo que lo mejor es utilizar un paquete dedicado a las contraseñas hashing para este como passlib: http://packages.python.org/passlib/ por razones como yo explicados aquí: https://stackoverflow.com/a/10948614/893857
¡Gracias! passlib - rápido y fácil.:-) – dlink
aquí es una manera más sencilla (tomado de effbot), a condición de contraseñas con una longitud superior a 8 no será un problema *:
import crypt
import random, string
def getsalt(chars = string.letters + string.digits):
# generate a random 2-character 'salt'
return random.choice(chars) + random.choice(chars)
para generar el contraseña:
crypt.crypt("password", getsalt())
*: Una contraseña con una longitud superior a 8 se elimina de la derecha hasta 8 caracteres de largo
crypt tiene problemas para cifrar la contraseña de más de 8 caracteres Creo que – llazzaro
que respondieron esta aquí: https://stackoverflow.com/a/18488878/1661689, y lo mismo hizo @Koffie.
No sé cómo hacer suficiente hincapié en que la respuesta aceptada NO es segura. Es mejor que el texto sin formato, y mejor que un hash sin sal, pero sigue siendo extremadamente vulnerable al diccionario e incluso ataques de fuerza bruta. En su lugar, utilizan un KDF LENTO como bcrypt (o al menos PBKDF2 con 10.000 iteraciones)
¿Está sugiriendo que el almacenamiento de contraseñas hashed correctamente salados es una práctica ** extremadamente vulnerable **? No puede usar un ataque de diccionario en hashes salados. – vroomfondel
No. Estoy sugiriendo que una sola iteración de SHA-1, como sugiere el código anterior, no está "correctamente salada y picada". Usted * puede * usar un ataque de diccionario en hashes salados, y cuanto más rápido sea el hash, más rápido se podrá probar cada pw. ¿Preferiría que transcurriera un día o 64,000 días para que el ataque tuviera éxito? El hash SHA-x es * muy * rápido en hardware personalizado (ASIC). https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet#Impose_infeasible_verification_on_attacker http://stackoverflow.com/questions/13545677/python-passlib-what-is-the-best-value-for-rounds –
@rz dice "Eche un vistazo a cómo lo hace Django" y luego muestra un código que es completamente diferente. Django * does * lo hace correctamente: https://github.com/django/django/blob/master/django/contrib/auth/hashers.py#L216 –
- 1. Método preferido para almacenar contraseñas en la base de datos
- 2. ¿Es seguro almacenar nombre de usuario + contraseñas en una base de datos SQLite local en Android?
- 3. ¿El archivo app.config es un lugar seguro para almacenar contraseñas?
- 4. cómo almacenar contraseñas en la base de datos?
- 5. ¿Es seguro almacenar contraseñas hash con MD5CryptoServiceProvider en C#?
- 6. Mejor método para almacenar Enum en la base de datos
- 7. Almacenar en Datos de Sesión vs almacenar en Base de Datos Sql para datos temporales
- 8. Cómo almacenar y recuperar una matriz de bytes (datos de imagen) desde y hacia una base de datos SQLite?
- 9. ¿Dónde almacena contraseñas de base de datos?
- 10. base de datos/NoSQL - forma latencia más baja para recuperar los datos siguientes
- 11. Almacenar y recuperar valores de web.config
- 12. Almacenar y recuperar configuraciones para el usuario en asp.net mvc
- 13. Almacenar y recuperar tablas de datos de la sesión
- 14. almacenar y recuperar colores con la base de datos, C# windows formularios solicitud
- 15. ¿Cuál es la mejor manera de almacenar/recuperar datos para un escritorio sin usar una base de datos?
- 16. ¿Cómo almacenar contraseñas * correctamente *?
- 17. Manera segura de almacenar contraseñas descifrables
- 18. ¿Cuál es la forma recomendada de cifrar contraseñas de usuario en una base de datos?
- 19. ¿Es seguro almacenar contraseñas en el código fuente de la aplicación web?
- 20. Almacenar un HashMap en una base de datos SQL
- 21. ¿Cómo recuperar nombres de tabla en una base de datos mysql con Python y MySQLdb?
- 22. Cómo almacenar y usar una sal de shiro desde la base de datos
- 23. Mejor + Más fuerte método de encriptación para bases de datos
- 24. Esquema de la base de datos para almacenar datos SNMP
- 25. Almacenamiento de contraseñas con python
- 26. ¿Qué tipo de base de datos NoSQL es más adecuada para almacenar datos jerárquicos?
- 27. Recuperar datos de XML python
- 28. Python, almacena un dict en una base de datos
- 29. Mejores prácticas para almacenar contraseñas de producción para grupos pequeños
- 30. ¿Cuál es el mejor método para almacenar valores predeterminados en la base de datos?
un montón de información aquí: http://stackoverflow.com/questions/1183161/to-sha512-hash-a- password-in-mysql-database-by-python –