c - 在 C 中从用户那里获取*安全*输入的最佳方式是什么?

标签 c security input libgcrypt

我正在开发一种安全的密码管理器。它不会用于专业用途,而且我知道它不会像 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/

相关文章:

c - Bison - 推送和纯解析器的附加参数

c - typedef uintX_t 类型,其中 X 是宏的值

c# - 确保只有计划任务可以调用 Controller 操作

java - 取消用户输入

Java 输入不工作(初学者)

c - timeval和微秒之间的精确转换

c - 如果存储了 Thrust device_vector 的 .begin() 迭代器,它在 resize() 之后是否仍指向正确的位置?

algorithm - 如何阻止病毒类程序破坏内存

php - symfony2 和 symfony1 应用相同的密码加密

text - 如何在Bootstrap 3中自定义输入字段宽度