在python中mlock一个变量

时间:2015-09-28 10:31:25

标签: python swap system-calls

我正在为linux开发密码管理器应用程序,我正在使用Python。

由于安全原因,我想调用mlock‍‍系统调用,以避免在硬盘上交换密码变量。

我注意到python本身没有包装这个函数。

那么有什么办法可以避免交换吗?

由于

1 个答案:

答案 0 :(得分:1)

对于CPython,没有好的答案不会涉及编写Python C扩展,因为mlock适用于页面,而不是对象。 str对象的内部因版本而异(在Py3.3及更高版本中,str实际上可能在内存中有不同编码的数据副本,有些内联在对象结构之后,一些动态分配并通过指针链接),即使您使用ctypes来检索必要的地址,mlock - 通过ctypes mlock次呼叫编辑它们,您和# 39; ll有一段时间决定何时到mlock以及何时到munlock。由于mlock适用于网页,因此您必须仔细跟踪任何给定网页中当前有多少字符串(因为如果您只是盲目地mlockmunlock,那么还有更多要锁定一个页面,第一个munlock将解锁所有这些; mlock/munlock是一个布尔标志,它不计算锁定和解锁的数量。)

即使你管理了这个,你仍然会在密码获取和mlock之间进行竞争,在此期间可以将数据写入交换,并且这些缓存的备用编码是懒惰计算的,因此mlock任何给定时间的非NULL指针并不一定意味着这些指针可能不会在以后填充。

您可以通过谨慎使用mmap模块和memoryview来部分避免这些问题(mmap为您提供内存页面,memoryview引用内存而不复制它,因此ctypes可用于mlock页面),但您必须从头开始构建它(不能使用getpass模块,因为它会暂时存储为str

简而言之,Python并不像你想要的那样关心交换或内存保护;它信任交换文件配置为您所需的安全性(例如禁用或加密),既不提供额外保护也不提供您需要添加的信息。