【问题标题】:Completely erase object from memory in python在python中从内存中完全擦除对象
【发布时间】:2025-12-11 00:50:02
【问题描述】:

在使用 python 时,我遇到了一个有趣的问题:我的脚本读取了一些敏感信息,我希望数据在使用后立即被彻底清除。比如:

try:
    useData(sensitiveString)
except:
    print("There was a problem executing useData()")
finally:
    scrubFromMemory(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仍然可以“幽灵”存在于应用程序的内存转储中。我想避免这种情况。 编辑:错字 - gc.​​collect() 而不仅仅是 gc()

有什么建议可以让我从内存中彻底清除敏感字符串吗?

【问题讨论】:

    标签: python string security memory language-implementation


    【解决方案1】:

    你需要调用垃圾收集器。

    gc documentation

    gc.collect()
    

    【讨论】:

    • gc() 不会只删除对内存中对象的引用吗?字符串本身仍然会在内存中出现,不是吗? (另外,感谢您指出 - 这是原始帖子中的错字,我的意思是 gc.collect() 而不是 gc()
    • delsensitiveString 已经删除了引用。 gc 释放内存。
    【解决方案2】:

    好吧,显然,在 Python 中没有真正的方法可以做到这一点,因为字符串对象是不可变的。对这些字符串的引用无处不在。最好的方法是 del 和 gc.collect()。正如link 中所述,“接受它,或者继续前进。其他任何事情都会给你一种虚假的安全感”

    【讨论】: