2

我正在开发一种安全密码管理器。它不会用于专业用途,而且我知道它不会像 KeePass 或其他任何东西那样安全。这只是为了我自己对如何分配安全内存、使用加密算法等的理解。

为此,我使用 libgcrypt 并使用gcry_malloc_secure.

我现在已经到了某种程度,我需要用户输入他的密码以进行加密/解密。但正如我所见,任何控制台输入都首先缓冲在stdin(or argv[..]) 中,因此不在安全内存中。因此它可以“轻松”被攻击者读取。

我的程序中发生的任何与安全相关的事情都在securemem中,希望更难阅读/窃取。

所以我的问题就像标题所述:

让用户输入数据的最安全方法是什么?

4

1 回答 1

0

如果“安全”内存是指不会被分页到磁盘的内存,那么符合 POSIX 的 C 环境至少应该提供 mlock()。所以你可以创建一个不会被分页的缓冲区。但是您仍然必须找到一种将数据读入其中的方法,并且您可能必须在释放它之前将其归零,以避免敏感数据潜伏在进程空间中。

我想实现您需要的基本方法是创建一个缓冲区,将 mlock() 应用于它,然后将输入的字符逐个字符读入该缓冲区。

但是,如果您使用 stdio.h 调用,您仍然会遇到自动进行的缓冲。在 Linux 上,您可以在终端级别关闭此缓冲,然后使用 ioctl() 调用逐个读取字符。像 ncurses 这样的库有自己的方式来做类似的事情。我认为在其他平台上也可以实现类似的效果,但我对它们的了解还不够多,无法发表评论。

于 2017-08-25T08:22:35.063 回答