Maison > développement back-end > C++ > Comment puis-je masquer la saisie de l'utilisateur depuis la console lors de la saisie du mot de passe ?

Comment puis-je masquer la saisie de l'utilisateur depuis la console lors de la saisie du mot de passe ?

Mary-Kate Olsen
Libérer: 2025-01-01 13:01:10
original
442 Les gens l'ont consulté

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

Masquer les entrées utilisateur de l'entrée standard

Lors de la récupération d'informations sensibles telles que des mots de passe à partir de l'entrée standard, l'affichage des caractères saisis n'est pas souhaitable. Cet article explore les méthodes indépendantes de la plate-forme pour désactiver l'écho des caractères lors de la saisie.

Exemple de code

Considérez l'extrait de code suivant :

string passwd;
cout << "Enter the password: ";
getline(cin, passwd);
Copier après la connexion

Ceci Le code invite l'utilisateur à saisir un mot de passe, mais les caractères saisis sont visiblement affichés. Pour masquer les entrées des utilisateurs, nous utilisons des techniques spécifiques à la plate-forme décrites ci-dessous.

Solutions spécifiques à la plate-forme

Windows

#ifdef WIN32
#include <windows.h>
Copier après la connexion

Dans les systèmes Windows, SetConsoleMode peut être utilisé pour activer/désactiver l'écho des caractères. Désactivez l'écho en définissant ENABLE_ECHO_INPUT sur 0 :

SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode & ~ENABLE_ECHO_INPUT);
Copier après la connexion

Linux/macOS

#else
#include <termios.h>
Copier après la connexion

Pour les systèmes Linux et macOS, tcgetattr et tcsetattr sont utilisés pour récupérer et mettre à jour paramètres du terminal. Désactivez l'écho en effaçant le bit ECHO dans le champ c_lflag :

tty.c_lflag &^= ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &tty);
Copier après la connexion

Code final

En combinant ces techniques, le code suivant fournit une solution multiplateforme pour désactiver caractère faisant écho lors de la saisie du mot de passe :

#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;
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal