Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menyembunyikan Input Pengguna daripada Konsol Semasa Kemasukan Kata Laluan?

Bagaimanakah Saya Boleh Menyembunyikan Input Pengguna daripada Konsol Semasa Kemasukan Kata Laluan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-01 13:01:10388semak imbas

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

Menyembunyikan Input Pengguna daripada Input Standard

Apabila mendapatkan semula maklumat sensitif seperti kata laluan daripada input standard, memaparkan aksara yang ditaip adalah tidak diingini. Artikel ini meneroka kaedah agnostik platform untuk melumpuhkan bergema aksara semasa input.

Contoh Kod

Pertimbangkan coretan kod berikut:

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

Ini kod menggesa pengguna untuk memasukkan kata laluan, tetapi aksara yang ditaip dipaparkan dengan jelas. Untuk menyembunyikan input pengguna, kami menggunakan teknik khusus platform yang digariskan di bawah.

Penyelesaian Khusus Platform

Windows

#ifdef WIN32
#include <windows.h>

Dalam sistem Windows, SetConsoleMode boleh digunakan untuk menogol gema aksara. Lumpuhkan gema dengan menetapkan ENABLE_ECHO_INPUT kepada 0:

SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode & ~ENABLE_ECHO_INPUT);

Linux/macOS

#else
#include <termios.h>

Untuk sistem Linux dan macOS, tcgetattr dan tcsetattr digunakan untuk mendapatkan dan mengemas kini tetapan terminal. Lumpuhkan gema dengan mengosongkan bit ECHO dalam medan c_lflag:

tty.c_lflag &^= ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &tty);

Kod Akhir

Menggabungkan teknik ini, kod berikut menyediakan penyelesaian merentas platform untuk melumpuhkan aksara bergema semasa input kata laluan:

#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;
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyembunyikan Input Pengguna daripada Konsol Semasa Kemasukan Kata Laluan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn