首页 > 后端开发 > C++ > 如何在密码输入期间隐藏控制台中的用户输入?

如何在密码输入期间隐藏控制台中的用户输入?

Mary-Kate Olsen
发布: 2025-01-01 13:01:10
原创
366 人浏览过

How Can I Hide User Input from the Console During Password Entry?

从标准输入中隐藏用户输入

从标准输入检索密码等敏感信息时,显示键入的字符是不可取的。本文探讨了在输入过程中禁用字符回显的与平台无关的方法。

代码示例

考虑以下代码片段:

string passwd;
cout << "Enter the password: ";
getline(cin, passwd);
登录后复制

This代码提示用户输入密码,但键入的字符会明显显示。为了隐藏用户输入,我们采用下面概述的特定于平台的技术。

特定于平台的解决方案

Windows

#ifdef WIN32
#include <windows.h>
登录后复制

在Windows系统中,SetConsoleMode可用于切换字符回显。通过将 ENABLE_ECHO_INPUT 设置为 0 来禁用回显:

SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode & ~ENABLE_ECHO_INPUT);
登录后复制

Linux/macOS

#else
#include <termios.h>
登录后复制

对于 Linux 和 macOS 系统,使用 tcgetattr 和 tcsetattr 来检索和更新终端设置。通过清除 c_lflag 字段中的 ECHO 位来禁用回显:

tty.c_lflag &^= ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &tty);
登录后复制

最终代码

结合这些技术,以下代码提供了一个跨平台解决方案来禁用输入密码时回显字符:

#include <iostream>
#include <string>

void SetStdinEcho(bool enable = true) {
  #ifdef WIN32
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin, &mode);

    if (!enable)
      mode &= ~ENABLE_ECHO_INPUT;
    else
      mode |= ENABLE_ECHO_INPUT;

    SetConsoleMode(hStdin, mode);
  #else
    struct termios tty;
    tcgetattr(STDIN_FILENO, &tty);
    if (!enable)
      tty.c_lflag &^= ECHO;
    else
      tty.c_lflag |= ECHO;

    (void)tcsetattr(STDIN_FILENO, TCSANOW, &tty);
  #endif
}

int main() {
  SetStdinEcho(false);

  std::string password;
  std::cin >> password;

  SetStdinEcho(true);

  std::cout << password << std::endl;

  return 0;
}
登录后复制

以上是如何在密码输入期间隐藏控制台中的用户输入?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板