2009-06-11 8 views
19

Necesito almacenar la contraseña de un usuario por un corto período de tiempo en la memoria. ¿Cómo puedo hacerlo sin tener dicha información divulgada accidentalmente en los núcleos o en los trazados? ¿Hay alguna manera de marcar un valor como "sensible", por lo que no se guarda en ningún lugar mediante un depurador?Marcar datos como sensibles en python

+0

Consulte también esta pregunta: http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles

Respuesta

30

Editar

he hecho una solución que utiliza ctypes (que a su vez utiliza C) a la memoria cero.

import sys 
import ctypes 

def zerome(string): 
    location = id(string) + 20 
    size  = sys.getsizeof(string) - 20 

    memset = ctypes.cdll.msvcrt.memset 
    # For Linux, use the following. Change the 6 to whatever it is on your computer. 
    # memset = ctypes.CDLL("libc.so.6").memset 

    print "Clearing 0x%08x size %i bytes" % (location, size) 

    memset(location, 0, size) 

No garantizo la seguridad de este código. Está probado para trabajar en x86 y CPython 2.6.2. Un informe más largo es here.

El descifrado y el cifrado en Python no funcionarán. Las cadenas y enteros son internos y persistentes, lo que significa que está dejando un lío de información de contraseñas en todo el lugar.

Hashing es la respuesta estándar, aunque, por supuesto, el texto plano finalmente necesita ser procesado en alguna parte.

La solución correcta es hacer los procesos sensibles como un módulo C.

Pero si su memoria se ve comprometida constantemente, reconsideraría su configuración de seguridad.

+2

Esto es correcto. Si usted/alguna vez/leyó la contraseña en un objeto de Python, existe la posibilidad de que se vea comprometida por un volcado. Incluso el uso de C no es perfecto (aún puede congelar el programa y usar un depurador de nivel kernel), pero debería ser lo suficientemente bueno. –

+0

La escritura está muerta. :( – Barry

+0

Si este es el mismo 'memset' como se menciona en el siguiente artículo, esto tampoco es seguro. Http://www.viva64.com/en/b/0178/ o https://www.owasp.org /index.php/Insecure_Compiler_Optimization – Danny

2

No hay manera de "marcar como confidencial", pero podría encriptar los datos en la memoria y descifrarlos nuevamente cuando necesite usarlos; no es la solución perfecta, pero es lo mejor que se me ocurre.

2
  • XOR con una libreta de un solo almacena por separado
  • guarde siempre hash de salado en lugar de la contraseña en sí

o, si eres muy paranoico sobre vertederos, almacén de claves aleatorio único de alguna otra lugar, por ejemplo i un hilo diferente, en un registro, en su servidor, etc.

4

... La única solución para esto es usar estructuras de datos mutables. Eso es, solo debe usar estructuras de datos que le permiten dinámicamente reemplazar elementos. Por ejemplo, en Python puede usar listas para almacenar una matriz de caracteres . Sin embargo, cada vez que agrega o elimina un elemento de una lista, el idioma puede copiar la lista completa detrás de su parte posterior, dependiendo de los detalles de implementación. Para estar seguro, si tiene que cambiar el tamaño de forma dinámica una estructura de datos, debe crear una nueva, copiar datos, y luego escribir sobre el anterior. Por ejemplo:

def paranoid_add_character_to_list(ch, l): 
    """Copy l, adding a new character, ch. Erase l. Return the result.""" 
    new_list = [] 
    for i in range(len(l)): 
    new_list.append(0) 
    new_list.append(ch) 
    for i in range(len(l)): 
    new_list[i] = l[i] 
    l[i] = 0 
    return new_list 

Fuente: http://www.ibm.com/developerworks/library/s-data.html

  • Autor: John Viega ([email protected]) es co-autor del edificio seguro Software (Addison-Wesley, 2001) y Java Enterprise Architecture (O'Reilly and Associates, 2001).John es autor de más de 50 publicaciones técnicas , principalmente en el área de seguridad de software. También escribió Mailman, el Administrador de listas de correo de GNU e ITS4, una herramienta para encontrar vulnerabilidades de seguridad en los códigos C y C++.
+0

Como una variante: usando esta técnica para poblar un [bytearray] (https : //docs.python.org/3.1/library/functions.html#bytearray) da como resultado un objeto que se puede usar en lugar de una instancia 'bytes' en un montón de código python ... y se puede borrar de manera equivalente después. –

Cuestiones relacionadas