【发布时间】:2013-07-31 01:02:52
【问题描述】:
在我的情况下,我的应用程序的用户被要求输入密码才能启动它。要获取密码,我只需使用:
char c;
std::string password;
while ... // until the end of entry
{
c = fgetc(stdin);
password += c;
}
检查密码后,我会销毁该变量,因此无法使用我的程序的核心映像检索它。例如,如果有人使用“gcore”命令,然后在生成的核心中搜索密码,它不会找到它。
但就我而言,我仍然可以检索密码值,因为它似乎仍在标准输入缓冲区中。
所以我的问题是如何清除标准输入缓冲区以使用户键入的值不再在内存中可用?
对于我已经尝试过的信息:fflush、__fpurge、fwrite(从标准输入流的开始位置开始)......似乎没有任何效果。
提前谢谢你。
【问题讨论】:
-
不要尝试
fflush(stdin),这可能是未定义的行为。首先使用int c而不是char。 -
stdin中是否存在完整密码? 我认为没有。 -
简短的回答是,其中有足够的内容超出了您的控制范围,您可能无法保证,至少在可移植代码中是这样。为了接近,您可能必须(至少)指定您关心的编译器、库和操作系统。
-
如果这对您很重要,您可能不应该将密码存储在
std::string中(您无法直接控制是否复制其内部缓冲区或是否将其内存归零在它被释放之前)。 -
老实说,如果你不相信你的地址空间是安全的,那么无论如何你都会被吓到。因为即使您清除缓冲区,它也可能仍在内核缓冲区中。