2

我想尝试一个系统,在该系统中,我使用密钥并用网站名称对其进行加盐,然后对其进行散列并将散列用作我在加盐的站点上的密码。但是,我想安全地做到这一点。我的担忧是:

  1. 正在打印到终端的哈希(给定站点的我的密码)

  2. 哈希以及用于生成哈希的通用密钥都在内存中。

将密码打印到终端,然后关闭终端是否安全?Python 完成后,密钥和密码会从内存和磁盘中消失吗?我将使用 getpass,但这是否提供了任何实际的安全性,除了过肩的外观之外的任何东西?有没有办法安全地覆盖 RAM 中的原始密钥和哈希/密码?

4

2 回答 2

2

最简洁的答案是不。Python 会将密码存储在内存中的多个位置,也不会将其从内存中清除,它只是释放存储密码的内存区域。

例如,这意味着SecureString在 .NET 中找不到类似的东西。

有关这一切的更多信息:Python - 释放/替换字符串变量,它是如何处理的?

您最好的选择是编写自己的 C 库来处理内存中的输入和存储,并在其中构建一个shred()函数,不仅释放内存区域,而且在该内存分配上写入数据。

您是否在 ld_preload 中替换了 malloc 以及 python 不使用的内容。

import getpass
print getpass.getpass('Give me your password: ')

此外,散列通常是不好的。散列你的东西很好,如果你存储东西,纯文本是错误的,但你不应该将它用作身份验证方法,除非你知道为什么以及你在做什么。此外,通常你必须存储你的盐,这在大多数情况下是一个坏主意,因为这只会使哈希值全部归零。嗯,我累了,但谷歌周围,你会明白的。

于 2013-04-12T16:36:57.887 回答
2

我不会担心这些。如果您的机器上有恶意代理,那么您需要担心的问题比终端缓冲区和私有内存更大。

我确实知道已经有类似的解决方案比您描述的要巧妙得多;将主密码与域名相结合的浏览器插件,以创建一个独特的插件,具有很好的自动完成功能。

但如果这主要是一个编程练习,那就去做吧!“普通”用户将无法访问您的终端缓冲区。他们也不应该能够检查您的进程的内存。

于 2013-04-12T16:50:46.850 回答