Saltar al contenido

Protección con contraseña de Python

Esta noticia ha sido evaluado por nuestros especialistas así aseguramos la exactitud de esta noticia.

Solución:

Editar: su pregunta revisada deja en claro que le preocupa que las personas editen el código para omitir una verificación de contraseña. Sí, eso es bastante posible. Puede entregar su código en formato .pyc, pero eso no evitará necesariamente que alguien lo descompile y altere. Desafortunadamente, Python simplemente no está diseñado para evitar la alteración del código. Lo mejor que puede hacer es realizar algún tipo de transacción de autenticación con un servidor seguro, de modo que no importa cómo alguien altere el código, no pueda omitir ese paso. Dependiendo de su aplicación exacta, eso podría ser excesivo.


El problema de cómo administrar la autenticación de contraseña es un problema de seguridad complicado en el que la gente dedica toda su carrera. Sin embargo, aquí hay algo de información al respecto, que asume que está tratando de implementar su propia autenticación de contraseña desde cero:

Incluso para la protección informal con contraseña, como regla general, las contraseñas de los usuarios no se almacenan en forma de texto sin formato. En cambio, generalmente se usa una función hash unidireccional confiable para crear un patrón de bits que no se parece a la contraseña. Cuando se ingresa una contraseña, se aplica la misma función hash y se comparan los patrones de bits. Si son iguales, la probabilidad de que la contraseña se haya ingresado correctamente es bastante alta.

Lo que constituye una función hash “confiable” es complicado. Varias son de uso común y algunas de las funciones hash comunes son susceptibles de exploits conocidos.

Noelkd proporciona un código que demuestra este enfoque, aunque MD5, que utiliza su código, es (creo) uno que se ha visto comprometido hasta el punto de que existen mejores opciones. Este artículo también ofrece código para hacer algo similar:

Autenticación de usuarios y contraseñas en Python

Si su preocupación es almacenar la contraseña real que debe pasar a la base de datos SQLite en texto sin formato, ese es un problema diferente. La mayoría de las veces, he visto esas contraseñas almacenadas en texto plano en scripts o en un archivo de configuración, y la aplicación está estructurada de tal manera que comprometer esa contraseña es una cuestión de riesgo modesto.

Puede verificar el hash de lo que ha ingresado un usuario frente al hash de su contraseña para verificar si el usuario ha ingresado la contraseña correcta, he hecho un ejemplo muy simple para mostrar esto:

""" Python Password Check """
import hashlib
import sys

password = "2034f6e32958647fdff75d265b455ebf"

def main():
    # Code goes here
    print "Doing some stuff"
    sys.exit(0)


while True:
    input = raw_input("Enter password: ")
    if hashlib.md5(input).hexdigest() == password:
        print "welcome to the program"
        main()
    else:
        print "Wrong Password"

En el ejemplo, la contraseña con hash es "secretpassword" que hashes a "2034f6e32958647fdff75d265b455ebf" de modo que, como puede ver, incluso si se descompila el código fuente, solo puede ver el hash de la contraseña en lugar del texto del plan de la contraseña.

Para darle a esto una pequeña actualización para 2016, actualmente si sus contraseñas hash en Python deberían estar mirando una de las tres siguientes bibliotecas:

passlib

>>> # import the hash algorithm
>>> from passlib.hash import sha256_crypt

>>> # generate new salt, and hash a password
>>> hash = sha256_crypt.encrypt("toomanysecrets")
>>> hash
'$5$rounds=80000$zvpXD3gCkrt7tw.1$QqeTSolNHEfgryc5oMgiq1o8qCEAcmye3FoMSuvgToC'

>>> # verifying the password
>>> sha256_crypt.verify("toomanysecrets", hash)
True
>>> sha256_crypt.verify("joshua", hash)
False

Ejemplo sacado de aquí

bcrypt

import bcrypt
password = b"super secret password"
# Hash a password for the first time, with a certain number of rounds
hashed = bcrypt.hashpw(password, bcrypt.gensalt(14))
# Check that a unhashed password matches one that has previously been
#   hashed
if bcrypt.hashpw(password, hashed) == hashed:
    print("It Matches!")
else:
    print("It Does not Match :(")

django-scrypt

Si está haciendo la verificación en la máquina de un usuario, este puede editar el código como quiera, prácticamente sin importar lo que haga. Si necesita seguridad como esta, entonces el código debe ejecutarse en un lugar inaccesible, por ejemplo, un servidor. “No confíe en el cliente” es un principio importante de seguridad informática.

Creo que lo que quieres hacer es crear un script de servidor al que solo se pueda acceder mediante una contraseña que le proporcione el programa cliente. Este programa de servidor funcionará de manera muy similar al código de ejemplo que se proporciona en otras respuestas: cuando se crea un nuevo cliente, envían una contraseña de texto sin formato al servidor que lo pone a través de un cifrado unidireccional y lo almacena. Luego, cuando un cliente quiere usar el código que es el cuerpo principal de su programa, envía una contraseña. El servidor pasa esto a través del cifrado unidireccional y ve si coincide con alguna de las contraseñas almacenadas con hash. Si lo hace, ejecuta el código en el cuerpo principal del programa y envía el resultado al usuario.

Sobre un tema relacionado, las otras respuestas sugieren usar el md5 algoritmo. Sin embargo, este no es el algoritmo más seguro; aunque lo suficientemente seguro para muchos propósitos, el hashlib El módulo de la biblioteca estándar ofrece otros algoritmos más seguros, y no hay razón para no utilizarlos en su lugar.

valoraciones y reseñas

Si sostienes algún titubeo y capacidad de renovar nuestro sección eres capaz de ejecutar una nota y con placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *