我正在开发一种安全的密码管理器。它不会用于专业用途,而且我知道它不会像 KeePass 或其他任何东西那样安全。这只是为了我自己对如何分配安全内存、使用加密算法等的理解。
为此,我使用 libgcrypt 并使用 gcry_malloc_secure
分配我的内存。
我现在不知何故需要用户输入他的加密/解密密码。
但正如我所见,任何控制台输入都首先缓冲在 stdin
(或 argv[..]
)中,因此不在安全内存中。因此它可以“轻松”被攻击者读取。
我的程序中发生的任何与安全相关的事情都在 securemem 中,希望更难读取/窃取。
所以我的问题就像标题说的那样:
让用户输入数据的最安全方式是什么?
最佳答案
如果您所说的“安全”内存是指不会被分页到磁盘的内存,那么符合 POSIX 的 C 环境至少应该提供 mlock()。所以你可以创建一个不会被分页的缓冲区。但是您仍然必须找到一种方法将数据读入其中,并且您可能必须在释放它之前将其归零,以避免敏感数据潜伏在进程空间中。
我想实现您需要的基本方法是创建一个缓冲区,对其应用 mlock(),然后将输入的字符逐个字符读入该缓冲区。
但是,如果您使用 stdio.h 调用,您仍然会与自动进行的缓冲发生冲突。在 Linux 上,您可以在终端级别关闭此缓冲,然后使用 ioctl() 调用逐个读取字符。像 ncurses 这样的图书馆有自己的方式来做类似的事情。我想在其他平台上也可以实现类似的效果,但我对它们的了解还不够多,无法发表评论。
关于c - 在 C 中从用户那里获取*安全*输入的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45874394/