Как изменить внутренний буфер std::cin

Я пишу программу, которая получает пароль, используя std::cin

Однако маловероятно, но я пытаюсь избежать возможности того, что пароль будет загружен на диск из памяти, поэтому я хочу изменить буфер std::cin, чтобы перезаписать пароль, как только я закончу с ним.

сейчас у меня это:

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

но я почти уверен, что это плохо, так как не учитывает текущий размер буфера cin. Как правильно перезаписать содержимое буфера?

спасибо за любую помощь!


person Jorge    schedule 05.12.2009    source источник


Ответы (2)


Вы можете использовать gptr() и egptr(), чтобы получить начало и конец буфера.

Изменить: как указал Чарльз Бейли, они защищены. Мое предположение состоит в том, что если вам нужен потоковый буфер, содержимое которого можно очистить в указанное время, вам следует реализовать один из ваших собственных, производный от одного из стандартных классов потокового буфера, но предоставляющий член clear() (или что-то еще). имя, которое вы считаете удобным). Изменение содержимого буфера без ведома менеджера буфера, как правило, довольно плохо...

person Jerry Coffin    schedule 05.12.2009
comment
gptr() и egptr() защищены, поэтому, если вы не пишете класс streambuf, который изначально использует реализация std::cin, это не поможет, если только я не понимаю ваш ответ? - person CB Bailey; 05.12.2009

Даже если вы сразу перечеркнете буфер, все равно возможно, что пароль записан на диск. Системный буфер ввода-вывода может быть загружен на диск, как и рабочая память, в которой находится std::cin. Раньше я разрабатывал криминалистическое программное обеспечение, которое выявляло именно эти условия.

person wallyk    schedule 05.12.2009
comment
но не будет ли перезапись буфера перезаписывать ту же область памяти? - person Jorge; 05.12.2009
comment
нельзя ли указать ядру сделать определенную выровненную страницу неразборчивой для подкачки диска? - person Hassan Syed; 05.12.2009
comment
@Jorge: дело в том, что даже если пароль находится в памяти только для одного командного цикла, есть вероятность, что он будет выгружен на диск. @Vainstah: это возможно с программной копией буфера потока и, возможно, даже с копией библиотеки времени выполнения, но как насчет системных буферов ввода-вывода? Нет никакого способа узнать, где они. - person wallyk; 05.12.2009
comment
криминалистика: 1 разработчик: 0 ::аплодисменты:: - person Jorge; 05.12.2009