mlock python 中的变量[重复]

问题描述 投票:0回答:1

我正在开发一个 Linux 密码管理器应用程序,并且使用 Python。

出于安全原因,我想调用u200d

mlock‍‍
系统调用以避免在硬盘驱动器上交换密码变量。

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

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

谢谢

python swap system-calls
1个回答
2
投票

对于 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 并不按照你想要的方式关心交换或内存保护;它信任交换文件配置为您所需的安全性(例如禁用或加密),既不提供额外的保护,也不提供您添加它所需的信息。

© www.soinside.com 2019 - 2024. All rights reserved.