我正在为linux开发密码管理器应用程序,我正在使用Python。
由于安全原因,我想调用mlock
系统调用,以避免在硬盘上交换密码变量。
我注意到python本身没有包装这个函数。
那么有什么办法可以避免交换吗?
由于
答案 0 :(得分:1)
对于CPython,没有好的答案不会涉及编写Python C扩展,因为mlock
适用于页面,而不是对象。 str
对象的内部因版本而异(在Py3.3及更高版本中,str
实际上可能在内存中有不同编码的数据副本,有些内联在对象结构之后,一些动态分配并通过指针链接),即使您使用ctypes
来检索必要的地址,mlock
- 通过ctypes
mlock
次呼叫编辑它们,您和# 39; ll有一段时间决定何时到mlock
以及何时到munlock
。由于mlock
适用于网页,因此您必须仔细跟踪任何给定网页中当前有多少字符串(因为如果您只是盲目地mlock
和munlock
,那么还有更多要锁定一个页面,第一个munlock
将解锁所有这些; mlock/munlock
是一个布尔标志,它不计算锁定和解锁的数量。)
即使你管理了这个,你仍然会在密码获取和mlock
之间进行竞争,在此期间可以将数据写入交换,并且这些缓存的备用编码是懒惰计算的,因此mlock
任何给定时间的非NULL
指针并不一定意味着这些指针可能不会在以后填充。
您可以通过谨慎使用mmap
模块和memoryview
来部分避免这些问题(mmap
为您提供内存页面,memoryview
引用内存而不复制它,因此ctypes
可用于mlock
页面),但您必须从头开始构建它(不能使用getpass
模块,因为它会暂时存储为str
。
简而言之,Python并不像你想要的那样关心交换或内存保护;它信任交换文件配置为您所需的安全性(例如禁用或加密),既不提供额外保护也不提供您需要添加的信息。