Python – Liberar / reemplazar una variable de cadena, ¿cómo se maneja?

Digamos que passWd una contraseña en texto sin formato en una variable llamada passWd como una cadena. ¿Cómo libera Python esta variable una vez que la descarte (por ejemplo, con del passWd o passWd= 'new random data' )?

La cadena se almacena como una matriz de bytes, lo que significa que se puede sobrescribir en el lugar de memoria que existió originalmente o se trata de un conjunto fijo en un área de memoria que no se puede modificar. ¿Se crea y el área antigua no se elimina, pero no se sobrescribe con null?

Estoy cuestionando cómo Python implementa la seguridad de las áreas de memoria y me gustaría saber más al respecto, principalmente porque tengo curiosidad 🙂

Por lo que he recostackdo hasta ahora, el uso de del (o __del__ ) hace que el intérprete no libere automáticamente las áreas de memoria de esa variable, lo que puede causar problemas, y tampoco estoy seguro de que dele sea tan fuerte al eliminar los valores. Pero eso es solo de lo que he reunido y no algo en blanco o negro 🙂

La razón principal por la que pregunto es que tengo la intención de escribir una aplicación de traspaso que obtenga una cadena, realice algunas operaciones de E / S, las transmita a otro subsistema (por ejemplo, el cargador de arranque para raspberry pi) y la interfaz esté escrita en Python (qué extraño debe sonar en los oídos de algunas personas …) y no me preocupa que los datos se vean comprometidos durante los cálculos de E / S, pero que podría haber un volcado de memoria entre los dos traspasos de subsistemas. o si el sistema está congelado (digamos una hibernación), por ejemplo, 20 minutos después de que se inicie el sistema y eliminé la variable lo más rápido que pude, pero de alguna manera todavía está en la memoria a pesar de que hago una del passWd 🙂

(Ps. He preguntado sobre el Superusuario, me refirieron aquí y, ¡lo siento por la mala gramática!)

A menos que use métodos de entrada codificados personalizados para obtener la contraseña, estará en muchos más lugares que solo su cadena inmutable. Así que no te preocupes demasiado.

El sistema operativo debe tener cuidado de que los datos de su proceso se borren antes de que la memoria se asigne a otro proceso. Por supuesto, esto puede fallar si la página se copia al disco (se intercambia o se hiberna).

La entrada segura de la contraseña no es fácil. Tal vez puedas encontrar una biblioteca especial o módulo que maneje esto.

Finalmente me puse a punto con dos soluciones. ld_preload para reemplazar la funcionalidad del manejo de cadenas de Python en un nivel inferior. Otra opción que es un poco más fácil fue desarrollar mi propia biblioteca de C que tiene más funcionalidad que lo que ofrece Python a través del manejo de cadenas estándar.

Principalmente, el código C tiene una función shread () que escribe sobre el área de memoria donde se almacenó la cadena “estaba” y algunas otras comprobaciones de errores.

Sin embargo, @Ber me dio una respuesta lo suficientemente buena como para comenzar a desarrollar mi propia solución, ya que (como él señaló) no hay un método seguro en Python y Python almacena cadenas en muchos lugares y depende del sistema operativo (que, por sí solo no es algo malo, excepto cuando no confía en el sistema operativo en el que está instalando su aplicación realmente segura.