在C中从用户那里获得* secure *输入的最佳方法是哪种?

时间:2017-08-25 04:19:50

标签: c security input libgcrypt

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

为此,我使用libgcrypt并使用gcry_malloc_secure分配内存。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我认为实现你需要的一个基本方法是创建一个缓冲区,对它应用mlock(),然后逐个字符地读入该缓冲区。

但是,如果你使用stdio.h调用,你仍然会自动违反缓冲。在Linux上,您可以在终端级别关闭此缓冲,然后使用ioctl()调用逐个读取字符。像ncurses这样的图书馆有自己做类似事情的方法。我认为在其他平台上可以实现类似的效果,但我不太了解它们的评论。