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