Python del用于标记收集的安全实例变量垃圾

时间:2014-06-05 23:31:10

标签: python garbage-collection

我有一个敏感的数据字段,我希望在内存中尽可能缩短生命周期。在帖子here之后,我有以下实现:

class UserData:
    def __init__(data):
        self.user_data = data #sensitive data 

    def get_user_data(self):
        return UserData.decrypt(self.user_data)

    @staticmethod
    def decrypt(data):
        ...

在帖子here之后,似乎我能做的最好是使用del并使字符串可用于GC。我有以下实现:

class UserData:
    def __init__(data):
        self.user_data = data #sensitive data 
        self._decrypted_user_data = None 

    @contextmanager      
    def get_user_data(self):
        self._decrypted_user_data = UserData.decrypt(self.user_data)
        yield
        del self._decrypted_user_data

    @staticmethod
    def decrypt(data):
        ...     

我有两个问题:

del on instance变量是否使变量可用于GC(即实例变量上的引用计数为0)。我问的原因是因为我知道 dict 会返回属性。如果没有,是否有办法为GC准备实例而不是整个对象?

比自己更安全._decrypted_user_data =无?

1 个答案:

答案 0 :(得分:2)

del将对象标记为垃圾,但不会将其删除。

在Python中,字符串是不可变的。即使你del一个字符串,它也会存在于内存中,尽管无法恢复。考虑使用 可覆盖的其他类型:

  

bytearray([source [,encoding [,errors]]])

     

返回一个新的字节数组。   bytearray类型是0 <=范围内的可变整数序列   x&lt;它有大多数常用的可变序列方法,   在可变序列类型中描述,以及大多数方法   bytes类型有,请参见Bytes和Byte Array Methods。

https://docs.python.org/3.1/library/functions.html#bytearray

要存储密码,请将其读/写为bytearray,即一串数字。要删除密码,请覆盖bytearray的元素,然后覆盖del引用。即使物体重新浮出水面,也会充满胡言乱语。