python - 在python中mlock一个变量

标签 python swap system-calls

<分区>

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

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

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

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

谢谢

最佳答案

对于 CPython,没有不涉及编写 Python C 扩展的好的答案,因为 mlock 在页面上工作,而不是在对象上工作。 str 对象的内部结构因版本而异(在 Py3.3 及更高版本中,一个 str 实际上可能在内存中以不同的编码具有多个数据副本,一些在对象结构之后内联,一些单独动态分配并通过指针链接),即使您使用 ctypes 检索必要的地址并通过 mlock ctypes 调用对它们全部进行 mlock 编辑,您也会花很多时间来确定何时使用 mlock 以及何时使用 munlock 。由于 mlock 在页面上工作,您必须仔细跟踪任何给定页面中当前有多少字符串(因为如果您只是盲目地使用 mlockmunlock,并且页面中有不止一个东西要锁定,第一个 munlock 将解锁所有这些;mlock/munlock 是一个 bool 标志,它不计算锁定和解锁的次数。

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

你可以通过小心使用 mmap 模块和 memoryview 来部分避免这些问题(mmap 给你内存页面,memoryview 引用说内存而不复制它,所以 ctypes 可以用于 mlock 页面),但是你会必须从头开始构建它(不能使用 getpass 模块,因为它会暂时存储为 str)。

简而言之,Python 不会按照您想要的方式关心交换或内存保护;它相信将交换文件配置为您所需的安全性(例如禁用或加密),既不提供额外保护也不提供您需要添加它的信息。

关于python - 在python中mlock一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820862/

相关文章:

python - 打印多个没有空格的对象

c++ - 交换功能的好处?

algorithm - 错误 : no matching function for call to 'swap'

c - Linux 系统调用、libc、VDSO 和实现剖析

python - 确保多个线程中的Python登录是线程安全的

python - 修改和推广间隔重复软件的最佳方式

python - 初学者 Python : Reading and writing to the same file

python - 交换文本文件中的文本行

c - RegisterClassEx函数返回的ATOM有什么用?

c - 如何用同一个缓冲区写入两个不同的地方? (C-系统调用)