5

假设我将密码以纯文本形式存储在称为passWd字符串的变量中。一旦我丢弃它(例如,使用del passWdpassWd= 'new random data'),python如何释放这个变量?

字符串是否存储为字节数组,这意味着它可以在它最初存在的内存位置被覆盖,还是它是内存区域中的固定集合,无法修改,并且在分配新值时新的内存区域是创建并且旧区域被丢弃但不被null覆盖?

我在质疑 Python 如何实现内存区域的安全性,并想了解更多,主要是因为我很好奇 :)

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

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

(Ps。我问过超级用户,他们把我介绍到这里,我很抱歉语法不好!)

4

2 回答 2

2

除非您使用自定义编码输入法来获取密码,否则它将出现在更多的地方,而不仅仅是您的不可变字符串。所以不要太担心。

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

安全密码输入并不容易。也许您可以找到处理此问题的特殊库或模块。

于 2013-04-09T15:04:04.937 回答
0

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

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

但是,@Ber 给了我一个足够好的答案来开始开发我自己的解决方案,因为(正如他所指出的)Python 中没有安全的方法,并且 python 将字符串存储在许多地方并依赖于操作系统(它自己这不是一件坏事,除非您不信任正在安装真正安全的应用程序的操作系统)。

于 2013-05-02T08:59:30.647 回答