2014-09-23 2 views
11

ich die password, zum Beispiel, um zu überprüfen, ob Kennwort ein einfaches C Programm schreiben wollen zu gleich ist dann Willkommen drucken ich will sonst versuchen Sie es erneut. Aber das Problem ist, wie folgt:how in Form von Sternchen Passwort eingeben zeigen (*) auf dem Terminal

Ich möchte Passwort in das Formular eingeben, um anzuzeigen von* (Sterne). zum Beispiel ..wenn der Benutzer 1234 eingeben wird, wird er als **** angezeigt, damit andere Personen das eingegebene Passwort nicht sehen können.

Kann mir jemand eine Idee geben, wie man es mit C oder C++ erreichen kann. Plattform: UNIX

+2

können Sie das, was Sie zuerst geschrieben haben, posten? – SSC

+4

Duplizieren: http://stackoverflow.com/questions/17130979/how-to-haves-password-echoed-as-asterisks-using-getch –

+3

Sie müssen Ihre Plattform angeben, da die Lösung plattformspezifisch –

Antwort

17

Die Lösung hierfür ist plattformspezifisch, leider.

Unter Linux oder BSD, können Sie die readpassphrase Funktion (es verwenden, ist auch getpass, obwohl es eine Größe des Puffers von nicht erlaubt und Puffer leidet durch den Anrufer zur Verfügung gestellt werden. Die Dokumentation des GNU Lib C (Link defekt? Versuchen this alternative Stattdessen bietet die Bibliothek auch eine hervorragende Anleitung, wie Sie dies selbst in Termen der unteren Ebene implementieren können, die Sie für andere UNIX-Implementierungen anstelle von getpass verwenden können.

Unter Windows können Sie SetConsoleMode verwenden, um das standardmäßige Echoverhalten zu deaktivieren (und somit Ihre eigenen Zeichen wie das Sternchen wiederzugeben). Sie können dann SetConsoleMode verwenden, um das Echo wiederherzustellen.

Ich sollte jedoch hinzufügen, dass dies eine sehr schlechte Form der Authentifizierung ist, da es noch mehr Passwörter beinhaltet, die den Fluch jedes Benutzers (und nicht besonders sicher) sind. Ein besserer Ansatz besteht darin, einen Webserver in Ihrer Anwendung zu starten und die URL auszugeben, auf der sich der Benutzer authentifizieren soll. Der Vorteil dieses Ansatzes besteht darin, dass diese URL, wenn der Benutzer zu dieser URL navigiert, die delegierte Anmeldung an Identitätsanbieter von Drittanbietern wie Google, Facebook, Twitter usw. unterstützen kann. Auch wenn Sie keine Identitätsanbieter von Drittanbietern unterstützen, Dieser Ansatz bringt weitere Vorteile mit sich; Wenn Sie über andere webbasierte Tools verfügen, reduziert dieser Ansatz die Anzahl der vom Benutzer authentifizierten Vorgänge (da das Befehlszeilentool und die webbasierten Tools dieselbe Browsersitzung verwenden) und ermöglicht Ihnen, den Anmeldefluss nur einmal zu implementieren Phishing-Risiken werden ebenfalls gemildert (Benutzer können den Host im Browser einfach sehen, wenn sie ihre Anmeldeinformationen eingeben, im Gegensatz zur Eingabe von Anmeldeinformationen in der Befehlszeile, wo es viel einfacher ist, eine Eingabeaufforderung zu spoofen und wenn Sie im letzten Schritt nur zu localhost umleiten Majorität der Logik auf einem Remote-Host Dieser Ansatz ermöglicht auch Updates des Autorisierungsflusses unabhängig von der Client-Kommandozeilen-Anwendung zu implementieren, was wichtige Sicherheitsvorteile hat.Ein Web-basierter Login wie dieser ist nicht immer der richtige Ansatz. Es lohnt sich auch, alternative Authentifizierungsmechanismen wie libpam zu untersuchen (unter libpam würden Sie die Funktion pam_authenticate verwenden, um die Verwendung zu authentifizieren r statt das Passwort direkt als Eingabe zu nehmen). Es lohnt sich, etwas Forschung zu betreiben, um den besten Mechanismus für Ihren speziellen Anwendungsfall zu bestimmen.

+11

Tut mir leid, aber haben Sie nur empfohlen, dass der OP eine URL zu einer Authentifizierungsseite von seiner Konsolenanwendung ausgibt ??? –

+0

@LightnessRacesinOrbit, ja ich tat. Ja, ich weiß, es ist ungewöhnlich und seltsam, aber es ist 2014 ... selbst wenn Sie auf dem Terminal eingeben, haben Sie wahrscheinlich immer noch Zugriff auf einen Browser, und dies ist die einzige Möglichkeit, um delegierte Anmeldung korrekt und sicher zu implementieren, wo Sie sein können sichergestellt, dass Ihr Passwort (und in einigen Fällen das zweite Faktor-Token) nur an den Identity-Provider und nicht an die Konsolenanwendung gesendet wird. –

+1

@MichaelAaronSafyan Sicherheits- oder UX-Überlegungen gehen weit über den Rahmen dieser Frage hinaus, und Sie können sie nicht ohne weiteren Kontext sinnvoll angehen. Ich schlage vor, Sie entfernen den letzten Absatz Ihrer Antwort, es ist in diesem Zusammenhang sinnlos. –

-1
#include<iostream.h> 
    #include<stdio.h> 
    #include<string.h> 
    void main() 
    { 
    char str[10]; 
    int i=0,x,y; 
    cout<<"enter : "; 
    while(1) 
     { str[i]=getch(); 
     if(str[i]==13) 
     break; 
     if(str[0]==127||str[0]==8) 
     continue; 
     if(str[i]==127||str[i]==8) 
     { 
      i--; 
      x=wherex(); 
      y=wherey(); 
      gotoxy(x-1,y); 
      clreol(); 
     } 
     else 
     { 
      cout<<"*"; 
      i++; 
     } 
     } 
    if(strcmp(str,"1234")==0) 
    cout<<"Welcome"; 
    else 
    cout<<"Try again"; 
    } 
0

Unter Linux und einigen anderen Unix-ähnlichen Plattformen Sie termios.h dafür verwenden können.Sie müssen den echo-end-kanonischen Modus für die Ausgabe deaktivieren und nach jedem erhaltenen Zeichen * drucken. Es gibt C-Codebeispiel:

#include <termios.h> 

struct termios term; 

/* Disable echo input characters and buffered input by disabling ICANON*/ 
static void disable_echo() { 
    struct termios new; 
    if (tcgetattr(fileno(stdin), &term) != 0) { 
     perror("tcgetattr failed"); 
     exit(-1); 
    } 

    new = term; 
    new.c_lflag &= ~ICANON; 
    new.c_lflag &= ~ECHO; 
    if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0) { 
     perror("tcsetattr failed"); 
     exit(-1); 
    } 
} 

/* Enable normal terminal state after getting password*/ 
static void enable_echo() { 
    if (tcsetattr(fileno(stdin), TCSAFLUSH, &term) != 0) { 
     perror("tcsetattr failed"); 
     exit(-1); 
    } 
} 

/* Read password which will be printed as `*` characters */ 
static void mask_getstr(char* buf, size_t size){ 
    char c = '\0'; 
    while (--size > 0 && (c = getchar()) != '\n') { 
     *buf++ = c; 
     putchar('*'); 
    } 
    *buf = '\0'; 
} 
Verwandte Themen