Python释放/替换一个字符串变量,如何处理它?

2024-05-01 22:02:48 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我将密码以纯文本形式存储在名为passWd的变量中作为字符串。 一旦我丢弃了这个变量(例如,使用del passWd或{}),python如何释放它?在

字符串是以字节数组的形式存储的,这意味着它可以在它原来存在的内存位置被覆盖,还是在一个不能修改的内存区域中的固定集合,当分配一个新的值时,会创建一个新的存储区域,旧的区域被释放,但不会被null覆盖?在

我质疑Python是如何实现内存区域的安全性的,我想知道更多关于它的知识,主要是因为我很好奇:)

从我目前收集到的信息来看,使用del(或__del__)会导致解释器无法自动释放该变量的内存区域,这可能会导致问题,而且我也不确定del是否在删除这些值上如此紧张。但这只是我收集到的,不是黑白的东西:)

我问这个问题的主要原因是,我打算编写一个移交应用程序,它获取一个字符串,执行一些I/O操作,将它传递给另一个子系统(例如,raspberry pi的引导加载程序),接口是用Python编写的(这在某些人的耳朵里听起来一定很奇怪…),我不担心数据在i/O计算过程中受到损害,但在两个子系统切换之间可能会发生内存转储。或者,如果系统被冻结(比如休眠),那么在系统启动20分钟后,我尽可能快地删除了变量,但是不管怎么说,尽管我做了一个del passWd:)它仍然在内存中

(附言,我问过超级用户,他们把我介绍给这里,我很抱歉语法不好!)在


Tags: 内存字符串文本信息区域密码字节原因
2条回答

我终于想出了两个解决办法。 ld_preload替换较低级别Python的字符串处理功能。 另一个更简单的选择是开发我自己的C库,它的功能比Python通过标准字符串处理提供的功能更多。在

主要是C代码有一个shread()函数,该函数覆盖存储字符串“的”内存区域和其他一些错误检查。在

然而,@Ber给了我一个足够好的答案,让我开始开发自己的解决方案,因为(正如他指出的那样)Python中没有安全的方法,Python将字符串存储到很多地方,并且依赖于操作系统(这本身并不是坏事,除非你不信任安装实时安全应用程序的操作系统)。在

除非您使用自定义编码的输入方法来获取密码,否则密码将位于比不可变字符串更多的位置。所以不要太担心。在

在内存分配给另一个进程之前,操作系统应该注意清除进程中的所有数据。如果页面被复制到磁盘(换出或休眠),这当然会失败。在

安全密码输入并不容易。也许你可以找到一个专门的库或模块来处理这个问题。在

相关问题 更多 >