2010-12-21 5 views
2

Qu'est-ce qu'un moyen facile de stocker le mot de passe que l'utilisateur saisit tout en gardant le mot de passe caché?Stocker les mots de passe tout en gardant l'intégrité de 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(); 
    } 

Je veux stocker le mot de passe pour que je puisse faire un if (password[i] == root_password) simple pour le bon mot de passe se poursuit.

+0

une raison particulière que vous utilisez 'getch' en C++ au lieu de' cin.get'? –

+0

Aucune raison. Impossible de trouver d'autres moyens appropriés. –

+2

@Cody: getch ne renvoie pas l'entrée, contrairement à cin.get() classique – ybungalobill

Répondre

0

Votre problème semble être que vous ne vérifiez pas le caractère de fin de ligne '\ n' ni la fin de fichier.

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'; 

De cette façon, le mot de passe finira par être une chaîne ASCIIZ, adapté à l'impression avec puts, printf("%s", password), ou - cruciale ...

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

Notez que nous lisons au plus 8 caractères dans la mot de passe car nous avons besoin d'un caractère supplémentaire pour le terminateur NUL. Vous pourriez augmenter cela si vous le vouliez.

+0

Pourquoi dit-il que toutes mes variables pour cette section ne sont pas déclarées lorsqu'elles le sont? –

+0

Josh: incluez-vous les en-têtes nécessaires pour printf() et getch(), strcmp() si vous l'utilisez aussi? Sinon, je ne peux pas dire sans voir votre code exact - pourquoi ne pas le coller dans votre question ci-dessus, et lister l'erreur exacte du compilateur et le numéro de ligne ...? –

+0

Vous n'utilisez pas sizeof correctement là. Premièrement, vous êtes manquant(), et il retourne une taille en octets. Au lieu de tout le battage avec sizeof, vous pourriez avoir mis juste 10. Le -1 vous gêne, car

0

Vous devez utiliser l'API de console dans Windows. Voici un extrait qui désactive l'écho dans la fenêtre de la console. La fonction SetConsoleMode() est utilisée pour contrôler l'écho (entre autres). Je sauve l'ancien mode, afin que je puisse restaurer la console une fois le mot de passe récupéré.

En outre, les fonctions *ConsoleMode() nécessitent un handle pour le tampon d'entrée de la console. Comment vous pouvez obtenir un handle de ces tampons est décrit dans la documentation MSDN de CreateFile().

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

Puisque nous sommes en C++ et Windows faire ceci:

#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; 
} 

compilé & testé

Questions connexes