首頁 > 後端開發 > 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>
登入後複製

在oleWindows系統中,SetConsMode回顯。將ENABLE_ECHO_INPUT 設為0 來停用回顯:

SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode & ~ENABLE_ECHO_INPUT);
登入後複製

Linux/macOS

#else
#include <termios.h>
登入後複製

對於Linux 和macOS和更新終端設定。透過清除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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板