作为兴趣,我打算使用 python 编写一个密码管理脚本。
我的粗略想法是将帐户名和密码对存储在由 GPG 加密的 SQlite 数据库文件中。
问题来了:如何安全地为 SQlite 库提供临时解密的数据库文件?由于将原始文件放在隐藏路径中并不能保证安全性。或者我应该将解密的数据保存在内存中吗?如何?
我知道有一个用于 SQlite 数据库加密的第三方框架。但我很好奇它实际上是如何工作的,因为在这样的框架中处理中间数据似乎是不可避免的。
是的,将数据库保存在内存中似乎是一个可行的解决方案。让这有点困难的是 SQLite 可以轻松地在内存中创建一个数据库(使用:memory:
而不是文件名),但是让它加载已经存在的内存数据库有点痛苦:你必须实现自己的sqlite_vfs
. 我见过一种实现,但它已经很老了,我不确定它是否仍然有效。此外,从 Python 中使用它需要额外的努力。
尽管如此,将整个解密的数据库始终保存在内存中并不是很安全,因为您的内存可能偶尔会被分页到磁盘。所以,记住mlock
它。
一个更简单的解决方案是拥有一个普通的数据库,但在存储之前对所有数据进行加密。这样,您必须只将密码和一小部分解密数据保存在内存中。