防止RAM中的纯文本密码(Python)

时间:2012-08-04 15:14:36

标签: python security encryption

我实际上是在编写一个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的问题,以至于密码总是以纯文本形式存储?

我知道很多问题,但它是这个项目中最关键的安全点之一。

2 个答案:

答案 0 :(得分:3)

Python只能在解释器本身内部进行内省;因此,如果您担心读取密码的任何内容,那么某些东西要么必须获得解释器的访问权限,要么必须以某种方式转储进程内存。

除非你运行一些打开漏洞的python代码,否则解释器不会被破坏。基本上,只要您不使用pickle module之类的内容(可以load arbitrary python code into the interpreter),或者对任意代码调用evalexec,就应该是安全的。< / p>

当然,即使只是短暂的时间,也无法避免将主密钥存储在内存中。您可以限制存储的主密钥,直到您需要它为止,然后通过为其分配None来擦除变量。

答案 1 :(得分:3)

如果您的操作系统具有进程内存保护(所有现代操作系统都有此操作系统),那么在同一进程中运行的任何代码都可以访问密码。除非以特定于操作系统的方式授予对内存页面的特定访问权限,否则其他进程将无法访问数据:这是RPG完成的一种方法。内核可以访问你的内存,从而访问密码,但如果攻击媒介通过该路径,你会遇到一些严重的问题。

如果您的操作系统具有虚拟内存,则包含密码的页面可能会写入root用户有权访问的文件。因此,在root中运行的进程可以从那里读取密码。但是如果你有一个以root身份运行的流氓进程,你就会担心更严重的问题。

对象中的私有成员是语言级别保护,仅在编译或解释代码时强制执行。它对数据的RAM访问没有影响。

总而言之,密码在运行过程中是安全的。如果密码已保存到您控制的文件中或以您控制的某种方式写入流中,您只需要担心。