假设我将密码以纯文本形式存储在名为passWd
的变量中作为字符串。
一旦我丢弃了这个变量(例如,使用del passWd
或{
字符串是以字节数组的形式存储的,这意味着它可以在它原来存在的内存位置被覆盖,还是在一个不能修改的内存区域中的固定集合,当分配一个新的值时,会创建一个新的存储区域,旧的区域被释放,但不会被null覆盖?在
我质疑Python是如何实现内存区域的安全性的,我想知道更多关于它的知识,主要是因为我很好奇:)
从我目前收集到的信息来看,使用del
(或__del__
)会导致解释器无法自动释放该变量的内存区域,这可能会导致问题,而且我也不确定del是否在删除这些值上如此紧张。但这只是我收集到的,不是黑白的东西:)
我问这个问题的主要原因是,我打算编写一个移交应用程序,它获取一个字符串,执行一些I/O操作,将它传递给另一个子系统(例如,raspberry pi的引导加载程序),接口是用Python编写的(这在某些人的耳朵里听起来一定很奇怪…),我不担心数据在i/O计算过程中受到损害,但在两个子系统切换之间可能会发生内存转储。或者,如果系统被冻结(比如休眠),那么在系统启动20分钟后,我尽可能快地删除了变量,但是不管怎么说,尽管我做了一个del passWd
:)它仍然在内存中
(附言,我问过超级用户,他们把我介绍给这里,我很抱歉语法不好!)在
我终于想出了两个解决办法。 ld_preload替换较低级别Python的字符串处理功能。 另一个更简单的选择是开发我自己的C库,它的功能比Python通过标准字符串处理提供的功能更多。在
主要是C代码有一个shread()函数,该函数覆盖存储字符串“的”内存区域和其他一些错误检查。在
然而,@Ber给了我一个足够好的答案,让我开始开发自己的解决方案,因为(正如他指出的那样)Python中没有安全的方法,Python将字符串存储到很多地方,并且依赖于操作系统(这本身并不是坏事,除非你不信任安装实时安全应用程序的操作系统)。在
除非您使用自定义编码的输入方法来获取密码,否则密码将位于比不可变字符串更多的位置。所以不要太担心。在
在内存分配给另一个进程之前,操作系统应该注意清除进程中的所有数据。如果页面被复制到磁盘(换出或休眠),这当然会失败。在
安全密码输入并不容易。也许你可以找到一个专门的库或模块来处理这个问题。在
相关问题 更多 >
编程相关推荐