我有一个敏感的数据字段,我希望在内存中尽可能缩短生命周期。在帖子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 =无?
答案 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
引用。即使物体重新浮出水面,也会充满胡言乱语。