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