在 python 内从内存中完全删除对象
Completely erase object from memory in python
使用 python,我遇到了一个有趣的问题:我的脚本读取了一些敏感信息,我希望数据在使用后立即完全清除。类似于:
try:
useData(sensitiveString)
except:
print("There was a problem executing useData()")
finally:
scrubFromMemory(sensitiveString)
这是为了尽量减少 sensitiveString 仍然驻留在内存中的可能性,即使在发生错误时也是如此。
我考虑过更改字符串,例如:
sensitiveString = "*" * (len(sensitiveString)-1) # does this overwrites memory, or creates a new object?
sensitiveString = "*" * 10000 # sensitive string is guaranteed to be relatively short
del sensitiveString
gc.collect()
但我在某处读到,在 python 中(由于 c 实现),对字符串的修改将导致在内存中创建一个新的字符串对象。所以原来的 sensitiveString 仍然可以 "ghost" 存在于应用程序的内存转储中的某个地方。我想避免这种情况。
编辑:错字 - gc.collect() 而不仅仅是 gc()
有什么建议可以让我完全清除内存中的 sensitiveString 吗?
您需要调用垃圾收集器。
gc.collect()
好吧,显然,在 Python 中没有真正的方法可以做到这一点,因为字符串对象是不可变的。对这些字符串的引用随处可见。最好的方法是 del 和 gc.collect()。如本 link、"accept it, or move on. Anything else will give you a false sense of security"
中所述
使用 python,我遇到了一个有趣的问题:我的脚本读取了一些敏感信息,我希望数据在使用后立即完全清除。类似于:
try:
useData(sensitiveString)
except:
print("There was a problem executing useData()")
finally:
scrubFromMemory(sensitiveString)
这是为了尽量减少 sensitiveString 仍然驻留在内存中的可能性,即使在发生错误时也是如此。 我考虑过更改字符串,例如:
sensitiveString = "*" * (len(sensitiveString)-1) # does this overwrites memory, or creates a new object?
sensitiveString = "*" * 10000 # sensitive string is guaranteed to be relatively short
del sensitiveString
gc.collect()
但我在某处读到,在 python 中(由于 c 实现),对字符串的修改将导致在内存中创建一个新的字符串对象。所以原来的 sensitiveString 仍然可以 "ghost" 存在于应用程序的内存转储中的某个地方。我想避免这种情况。 编辑:错字 - gc.collect() 而不仅仅是 gc()
有什么建议可以让我完全清除内存中的 sensitiveString 吗?
您需要调用垃圾收集器。
gc.collect()
好吧,显然,在 Python 中没有真正的方法可以做到这一点,因为字符串对象是不可变的。对这些字符串的引用随处可见。最好的方法是 del 和 gc.collect()。如本 link、"accept it, or move on. Anything else will give you a false sense of security"
中所述