Lesen eines Passworts von std::cin

Lesezeit: 3 Minuten

Ich muss ein Passwort aus der Standardeingabe lesen und wollte std::cin um die vom Benutzer eingegebenen Zeichen nicht zu wiederholen …

Wie kann ich das Echo von std::cin deaktivieren?

Hier ist der Code, den ich derzeit verwende:

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

Ich suche nach einem OS-unabhängigen Weg, dies zu tun.
Hier Es gibt Möglichkeiten, dies sowohl in Windows als auch in * nix zu tun.

  • stackoverflow.com/questions/13687769/…

    – Daniel Weber

    3. Dezember 2012 um 17:07 Uhr

@wrang-wrang Antwort war wirklich gut, hat aber meine Bedürfnisse nicht erfüllt, das ist mein endgültiger Code (der auf basierte Das) aussehen:

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

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
}

Beispielverwendung:

#include <iostream>
#include <string>

int main()
{
    SetStdinEcho(false);

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

    SetStdinEcho(true);

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

    return 0;
}

  • gcc warnt hier: /home/curtine/git/pub/sxx/src/sxx.cpp: In Funktion ‘void set_stdin_echo(bool)’: /home/curtine/git/pub/sxx/src/sxx.cpp:84: 19: Fehler: negative Ganzzahl implizit in einen vorzeichenlosen Typ konvertiert [-Werror=sign-conversion] tty.c_lflag &= ~ECHO;

    – Ericcurtin

    24. April 2018 um 10:10 Uhr


  • Werde diese Warnung deaktivieren, denke ich

    – Ericcurtin

    24. April 2018 um 10:16 Uhr

  • Dies ist eine gute Antwort in Bezug auf den nicht widerhallenden Aspekt, aber ich habe sie abgelehnt, weil sie das Passwort in eine std::string liest, die nicht sicher ist (siehe zB stackoverflow.com/questions/5698002/…). Würden Sie erwägen, es zu überarbeiten, um es in ein Zeichen einzulesen[]? In diesem Fall würde ich meine Ablehnung gerne rückgängig machen.

    – Spitzname

    9. April 2020 um 7:16 Uhr

  • Auch in Bezug auf den Kommentar von @ericcurtin habe ich festgestellt &= ~(0u | ECHO) eine bessere Möglichkeit, die Warnung zu vermeiden, als sie einfach zu deaktivieren. Lustige API aber. :-$

    – Spitzname

    9. April 2020 um 7:18 Uhr

  • Nur zur Erinnerung an alle Leser, StackOverflow ist keine professionelle Sicherheitsberatung. Das heißt, @nickform, Sie können die einfach ersetzen std::cin Für ein char buffer[BUF_SIZE]; fgets(buffer, BUF_SIZE, stdin); aber Sie müssen den Puffer sicher neu schreiben, wie Eric darauf hingewiesen hat, und wenn Sie ihn manuell überschreiben möchten, können Sie dies auch mit dem tun std::string. Was Sie nicht tun können, ist, eine Klasse zu erstellen, die dies automatisch für Sie erledigt (abgeleitet von std::string).

    – Varga

    13. April 2020 um 14:09 Uhr


Lesen eines Passworts von stdcin
Jonathan Grähl

In der Norm steht dazu nichts.

Unter Unix könnten Sie je nach Terminaltyp einige magische Bytes schreiben.

Verwenden getpasswd wenn es verfügbar ist.

Sie können system() /usr/bin/stty -echo Echo zu deaktivieren, und /usr/bin/stty echo um es zu aktivieren (wieder unter Unix).

Dieser Typ erklärt wie man es macht, ohne “stty” zu verwenden; Ich habe es nicht selbst probiert.

  • ich schätze getpasswd würde wirklich helfen. Aber ich suche nach einer Möglichkeit, dies zu tun, ohne auf die schwarze Magie des Betriebssystems zurückzugreifen

    – Varga

    11. September 2009 um 22:04 Uhr

Wenn Sie sich nicht um Portabilität kümmern, können Sie verwenden _getch() in VC.

#include <iostream>
#include <string>
#include <conio.h>

int main()
{
    std::string password;
    char ch;
    const char ENTER = 13;

    std::cout << "enter the password: ";

    while((ch = _getch()) != ENTER)
    {
        password += ch;
        std::cout << '*';
    }
}

Es gibt auch getwch() zum wide characters. Mein Rat ist, dass Sie verwenden NCurse die erhältlich ist *nix Systeme auch.

Nur eine Idee, was ich habe, Sie könnten das Passwort Zeichen für Zeichen lesen und danach einfach die Rücktaste (“\ b”) und vielleicht ‘*’ drucken.

995090cookie-checkLesen eines Passworts von std::cin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy