1

我正在编写一个使用获取密码的软件std::cin

然而不太可能,我试图避免密码从内存分页到磁盘的可能性,所以我想修改缓冲区std::cin以在我完成密码后立即覆盖密码。

现在我有这个:

std::cin.clear();
std::stringstream ss;
ss << "0000000000000000000000000000000000000000000000";
std::cin.rdbuf(ss.rdbuf());
std::cin.clear();

但我很确定这很糟糕,因为它没有考虑到 cin 缓冲区的当前大小。如何正确覆盖缓冲区的内容?

谢谢你的帮助!

4

2 回答 2

3

即使您立即在缓冲区上乱涂乱画,密码仍有可能写入磁盘。系统 i/o 缓冲区可能被分页到磁盘,std::cin 所在的工作内存也可能被分页到磁盘。我曾经开发过能够准确嗅出这些条件的取证软件。

于 2009-12-05T17:40:25.943 回答
1

您可以使用gptr()andegptr()来获取缓冲区的开始和结束。

编辑:正如查尔斯贝利所指出的,这些是受保护的。我的假设是,如果您想要一个可以在指定时间清除其内容的流缓冲区,那么您将实现自己的一个从标准流缓冲区类之一派生的,但提供一个clear()成员(或任何名称你觉得方便)。在缓冲区管理器不知道的情况下更改缓冲区的内容通常是一件相当糟糕的事情......

于 2009-12-05T17:31:48.847 回答