首页 >后端开发 >C++ >如何禁用 C 的 `std::cin` 中的 Echo 以实现安全密码输入?

如何禁用 C 的 `std::cin` 中的 Echo 以实现安全密码输入?

Barbara Streisand
Barbara Streisand原创
2024-12-21 09:06:11440浏览

How Can I Disable Echo in C  's `std::cin` for Secure Password Input?

在密码输入时在 std::cin 中禁用 Echo

在需要保护密码等敏感输入不被回显的场景中,它变成对于在用户输入期间抑制字符可见性至关重要。本文深入研究了与操作系统无关的方法,用于在 std::cin(C 中的基本标准输入流)中禁用 echo。

考虑以下代码片段:

string passwd;
cout << "Enter the password: ";
getline(cin, passwd);

此代码提示用户输入密码,但明显回显键入的字符,从而使输入容易受到潜在的窃听。为了解决这个问题,以下解决方案提供了在输入过程中隐藏密码字符的安全方法。

Windows:

对于 Windows 系统,SetConsoleMode 函数提供对标准输入的控制回声。将 ENABLE_ECHO_INPUT 作为标志传递会启用回显,而其否定会禁用回显,确保密码在输入过程中保持隐藏状态。

HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin, &mode);
mode &= ~ENABLE_ECHO_INPUT;
SetConsoleMode(hStdin, mode);

POSIX:

在 POSIX 兼容系统上中,tcgetattr 和 tcsetattr 函数用于管理 stdin 的回显设置。取消设置 ECHO 标志会抑制回显,从而允许安全的密码输入。

struct termios tty;
tcgetattr(STDIN_FILENO, &tty);
tty.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &tty);

示例用法:

结合这两种方法的示例实现:

#ifdef WIN32
#include <windows.h>
#else
#include <termios.h>
#include <unistd.h>
#endif

void SetStdinEcho(bool enable = true)
{
#ifdef WIN32
    // Windows implementation
#else
    // POSIX implementation
#endif
}

int main()
{
    SetStdinEcho(false);
    string password;
    cin >> password;
    SetStdinEcho(true);
    cout << password << endl;
    return 0;
}

通过利用这些技术,开发者可以通过防止回显来有效增强密码安全性,确保敏感信息的用户输入体验更加安全检索。

以上是如何禁用 C 的 `std::cin` 中的 Echo 以实现安全密码输入?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn