【发布时间】:2012-08-02 07:49:00
【问题描述】:
我实际上编写了一个 Python 模块来访问 KeePass/KeePassX 数据库。我的问题是数据库的密码以纯文本形式保存在我的数据库对象中:
def __init__(self, filepath=None, masterkey=None, read_only=False,
new = False):
""" Initialize a new or an existing database.
If a 'filepath' and a 'masterkey' is passed 'load' will try to open
a database. If 'True' is passed to 'read_only' the database will open
read-only. It's also possible to create a new one, just pass 'True' to
new. This will be ignored if a filepath and a masterkey is given this
will be ignored.
"""
self.groups = []
self.read_only = read_only
self.filepath = filepath
self.masterkey = masterkey # I mean this
我不知道如何避免这种情况。我唯一的想法是存储使用随机生成的密钥加密的密码(就像 KeePassX 所做的那样),但是 Python 不允许私有成员是否存在问题?我的意思是可以从正在运行的程序外部访问随机生成的密钥吗?或者是从 RAM 中转储程序内存的唯一可能性?如果后者的答案是“是”,那么应该是提高安全性还是我被误导了?
无论哪种方式,是否存在 Python 将字符串“抛出”到整个 RAM 以使密码始终有可能以纯文本形式存储的问题?
我知道有很多问题,但这是该项目中最关键的安全点之一。
【问题讨论】:
-
无论何时将任何内容加载到内存中,即使是很短的时间,也总会有一个时刻可以转储内存并读出您的密钥。
-
你为什么要存储密码?大多数系统只存储一个哈希值,因此即使在数据库受损的情况下,黑客也不会找出人们的密码,除非他们很短。
-
这不是 KeePassX 的工作方式:它获取密钥,对其进行 n 次散列,添加一个随机字节字符串,然后再次对其进行散列。这是加密和解密的最终密钥。
标签: python security encryption