2010-12-21 10 views
2

Was ist eine einfache Möglichkeit, kann ich das Passwort speichern, das der Benutzer eingibt, während das Passwort immer noch versteckt bleibt?Speichern von Passwörtern unter Beibehaltung der Integrität von getch()

char password[9]; 
    int i; 
    printf("Enter your password: "); 
    for (i=0;i<9;i++) 
    { 
    password[i] = getch(); 
    printf("*"); 
    } 
    for (i=0;i<9;i++) 
    printf("%c",password[i]); 
    getch(); 
    } 

Ich möchte das Passwort speichern, so habe ich ein einfaches if (password[i] == root_password) tun kann, um das richtige Passwort auf weiter.

+0

einen besonderen Grund Sie verwenden 'getch' in C++ statt' cin.get'? –

+0

Kein Grund. Konnte keine anderen geeigneten Wege finden. –

+2

@Cody: Getch nicht die Eingabe, im Gegensatz zu typischen cin.get() – ybungalobill

Antwort

0

Ihr Problem scheint zu sein, dass Sie nicht nach Newline '\ n' oder nach dem Ende der Datei suchen.

printf("Enter your password: "); 
char password[9]; 
int i; 
for (i = 0; i < sizeof password - 1; i++) 
{ 
    int c = getch(); 
    if (c == '\n' || c == EOF) 
     break; 
    } 
    password[i] = c; 
    printf("*"); 
} 
password[i] = '\0'; 

Auf diese Weise Passwort wird bis zu sein ein ASCIIZ String, geeignet für den Druck mit puts, printf("%s", password) oder Ende - entscheidend ...

if (strcmp(password, root_password)) == 0) 
    your_wish_is_my_command(); 

Bitte beachten, dass wir höchstens 8 Zeichen in dem lesen Passwort, da wir ein zusätzliches Zeichen für den NUL-Terminator benötigen. Sie könnten das erhöhen, wenn Sie wollten.

+0

Warum heißt es, alle meine Variablen für diesen Abschnitt sind nicht deklariert, wenn sie sind? –

+0

Josh: Fügen Sie die erforderlichen Header für printf() und getch(), strcmp() ein, wenn Sie es auch verwenden? Ansonsten kann ich nicht sagen, ohne Ihren genauen Code zu sehen - warum fügen Sie ihn nicht in Ihre Frage oben ein und listen den genauen Compilerfehler und die Zeilennummer auf ...? –

+0

Sie verwenden dort nicht die richtige Größe. Zunächst fehlen Sie() und es wird eine Größe in Byte zurückgegeben. Anstelle des ganzen Hoopla mit sizeof, hättest du einfach 10 setzen können. Das -1 hindert dich daran, da

0

Sie müssen die Konsolen-API in Windows verwenden. Im Folgenden finden Sie ein Snippet, das das Echo im Konsolenfenster deaktiviert. Die Funktion SetConsoleMode() wird verwendet, um das Echo (unter anderem) zu steuern. Ich speichere den alten Modus, damit ich die Konsole wiederherstellen kann, sobald das Passwort abgerufen wurde.

Auch die *ConsoleMode() Funktionen benötigen ein Handle zum Konsolen-Eingabepuffer. Wie Sie diese Puffer verwalten können, ist in der MSDN-Dokumentation CreateFile() beschrieben.

int main(int argc, char* argv[]) 
{ 
    char password[100] = { 0 }; 
    printf("Enter your password: "); 

    HANDLE hConsole = ::CreateFile("CONIN$", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); 

    DWORD dwOldMode; 
    ::GetConsoleMode(hConsole, &dwOldMode); 
    ::SetConsoleMode(hConsole, dwOldMode & ~ENABLE_ECHO_INPUT); 

    bool bFinished = false; 
    while(!bFinished) { 
     if(!fgets(password, sizeof(password)/sizeof(password[0]) - 1, stdin)) { 
      printf("\nEOF - exiting\n"); 
     } else 
      bFinished = true; 
    } 

    ::SetConsoleMode(hConsole, dwOldMode | ENABLE_ECHO_INPUT); 
    printf("\nPassword is: %s\n", password); 

    return 0; 
} 
0

Da wir in C++ und Windows dies zu tun:

#include <iostream> 
#include <string> 
#include <conio.h> //_getch 
#include <Windows.h> //VK_RETURN = 0x0D 

using namespace std; 

string read_password() 
{ 
    string pass; 
    cout << "Enter your password: "; 

    int character = 0; 
    while(VK_RETURN != (character = _getch())) 
    { 
     cout << '*'; 
     pass += static_cast<char>(character); 
    } 

    cout << std::endl; 
    return pass; 
} 

int main() 
{ 
    string root_password = "anypass123"; 
    string pass = read_password(); 

    if (pass == root_password) 
    { 
     cout << "password accepted" << endl; 
    } 

    return 0; 
} 

zusammengestellt & getestet

Verwandte Themen