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
Respuesta
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.
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. –
La escritura está muerta. :( – Barry
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
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.
- 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.
... 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++.
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. –
- 1. Marcar como obsoleto
- 2. Python, IMAP y GMail. Marcar mensajes como se ve
- 3. caso Matching cadenas Unicode sensibles con expresiones regulares en Python
- 4. Marcar la diferencia como correcta en vimdiff
- 5. Marcar el elemento como obsoleto en XSD
- 6. ¿Dónde debería almacenar variables sensibles?
- 7. Migraciones de Marcar rieles como migradas
- 8. Inconvenientes de marcar una clase como Serializable
- 9. Caso RLIKE sensibles
- 10. ¿Cómo marcar código como estable usando Composer?
- 11. ¿Marcar objetos como incanzables Incur Overhead?
- 12. ¿Cómo marcar una clase como Deprecated?
- 13. cómo marcar una interfaz como DataContract en WCF
- 14. Android: cómo marcar sms como leído enRecibir
- 15. ¿Cómo marcar un conjunto .net como seguro?
- 16. Marcar como clase obsoleta de tercero
- 17. Marcar los parámetros como NOT anulables en C# /. NET?
- 18. caso cuadro combinado desplegable sensibles
- 19. Google Reader Api marcar todos como elemento como leído
- 20. marcar la columna existente como clave principal en la tabla de datos
- 21. Cómo marcar un parámetro de interruptor como obligatorio en Powershell
- 22. ¿Cómo puedo marcar una propiedad como obsoleta en Delphi?
- 23. ¿Cómo marcar algo en Qt como obsoleto (obsoleto)?
- 24. En VB.NET, ¿puedo marcar una función como obsoleta?
- 25. ¿Es posible marcar una prueba como pendiente en MiniTest?
- 26. ¿Puedo marcar una función como obsoleta en Scala?
- 27. ¿Cómo puedo marcar un elemento como leído con Google Reader API (utilizando Python)
- 28. ¿Cómo puedo marcar un formulario/campo como "sucio" si está enlazado a datos?
- 29. Como ir todos los botones de radio sin marcar
- 30. Bootstrap, haciendo cambios sensibles al diseño
Consulte también esta pregunta: http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles