25 Stimmen

Ein Passwort in C erhalten, ohne getpass (3) zu benutzen?

Ich könnte Folgendes gebrauchen getpass() um ein Passwort zu erhalten. Allerdings sagt die Manpage:

Diese Funktion ist obsolet. Nicht verwenden sie nicht.

Wie kann man ein Kennwort vom Terminal des Benutzers abrufen, ohne es mit einem Echo zu versehen, und zwar auf eine POSIX-kompatible Weise? (Ursprünglich sagte ich "portabel", aber ich wollte vermeiden, eine veraltete Funktion zu verwenden.]

4 Stimmen

Es gibt keinen portablen Weg - dies hängt stark von Ihrer Plattform ab.

1 Stimmen

@Jerry, das ist es nicht wert... auch wenn es LEGACY ist, ist es die tragbarste Art und Weise, es zu tun.

0 Stimmen

@MichaelAaronSafyan Ich stimme zu. Es ist eine seltsame Entscheidung zu treffen getpass() veraltet und sogar aus POSIX entfernt, ohne eine Alternative anzubieten (wie NetBSDs getpass_r() ). Jetzt macht jeder seine eigene Version, die mit Sicherheits-, Nutzbarkeits- und Portabilitätsfehlern behaftet ist.

18voto

dfa Punkte 110809

Dies sollte unter Linux/Macosx funktionieren, eine Windows-Version sollte Get/Set ConsoleMode

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>

int
main(int argc, char **argv)
{
    struct termios oflags, nflags;
    char password[64];

    /* disabling echo */
    tcgetattr(fileno(stdin), &oflags);
    nflags = oflags;
    nflags.c_lflag &= ~ECHO;
    nflags.c_lflag |= ECHONL;

    if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) {
        perror("tcsetattr");
        return EXIT_FAILURE;
    }

    printf("password: ");
    fgets(password, sizeof(password), stdin);
    password[strlen(password) - 1] = 0;
    printf("you typed '%s'\n", password);

    /* restore terminal */
    if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) {
        perror("tcsetattr");
        return EXIT_FAILURE;
    }

    return 0;
}

5voto

indy Punkte 749

Sie könnten die ncurses Bibliothek, um von der Standardeingabe zu lesen, ohne die Ergebnisse auf dem Bildschirm auszugeben. (Aufruf noecho() bevor sie eine Eingabe erhalten). Die Bibliothek gibt es schon seit Ewigkeiten und funktioniert auf einer Vielzahl von Plattformen (die Windows-Version finden Sie unter aquí )

5voto

Vanessa Deagan Punkte 417

Auch wenn dies eine sehr alte Frage ist, die bereits beantwortet wurde, hier ist, was ich verwendet habe (was der akzeptierten Antwort sehr ähnlich ist):

#include <termios.h>
#include <cstdio>

//
// The following is a slightly modifed version taken from:
// http://www.gnu.org/software/libc/manual/html_node/getpass.html
//
ssize_t my_getpass (char *prompt, char **lineptr, size_t *n, FILE *stream)
{
    struct termios _old, _new;
    int nread;

    /* Turn echoing off and fail if we can’t. */
    if (tcgetattr (fileno (stream), &_old) != 0)
        return -1;
    _new = _old;
    _new.c_lflag &= ~ECHO;
    if (tcsetattr (fileno (stream), TCSAFLUSH, &_new) != 0)
        return -1;

    /* Display the prompt */
    if (prompt)
        printf("%s", prompt);

    /* Read the password. */
    nread = getline (lineptr, n, stream);

    /* Remove the carriage return */
    if (nread >= 1 && (*lineptr)[nread - 1] == '\n')
    {
        (*lineptr)[nread-1] = 0;
        nread--;
    }
    printf("\n");

    /* Restore terminal. */
    (void) tcsetattr (fileno (stream), TCSAFLUSH, &_old);

    return nread;
}

//
// Test harness - demonstrate calling my_getpass().
//
int main(int argc, char *argv[])
{
    size_t maxlen = 255;
    char pwd[maxlen];
    char *pPwd = pwd; // <-- haven't figured out how to avoid this.

    int count = my_getpass((char*)"Enter Password: ", &pPwd, &maxlen, stdin);

    printf("Size of password: %d\nPassword in plaintext: %s\n", count, pwd);

    return 0;
}

1voto

Brian Punkte 24901

Unter Windows können Sie wahrscheinlich die SetConsoleMode api, beschrieben aquí .

1voto

Kredns Punkte 35211

Según la Dokumentation der Universität von Milwaukee sie ist veraltet, weil:

El getpass() Funktion ist nicht thread-sicher, da sie den globalen Signalzustand manipuliert.

El getpass() Funktion soll in einer zukünftigen Version der X/Open CAE-Spezifikation zurückgezogen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X