c ++ - Opbevaring af adgangskoder, samtidig med at getch ()

Indlæg af Hanne Mølgaard Plasc

Problem



Hvilken nem måde kan jeg gemme adgangskoden til brugeren, mens du stadig holder adgangskoden gemt?


  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();
   }


Jeg vil gemme adgangskoden, så jeg kan gøre en simpel if (password[i] == root\_password), så den rigtige adgangskode fortsætter.

Bedste reference


Dit problem ser ud til at være, at du ikke tjekker for newline '\ n' eller end-of-file.


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


På denne måde bliver adgangskoden en ASCIIZ-streng, der er egnet til udskrivning med puts, printf("\%s", password) eller - afgørende ...


if (strcmp(password, root\_password)) == 0)
    your\_wish\_is\_my\_command();


Bemærk at vi læser højst 8 tegn i adgangskoden, da vi har brug for et ekstra tegn til NUL-terminatoren. Du kunne øge det, hvis du ville.

Andre referencer 1


Du skal bruge konsol API i Windows. Nedenfor er et uddrag, der deaktiverer ekko i konsolvinduet. Funktionen SetConsoleMode() bruges til at styre ekkoen (blandt andet). Jeg gemmer den gamle tilstand, så jeg kan gendanne konsollen, når adgangskoden er hentet.


Funktionerne *ConsoleMode() har også brug for et håndtag til konsolindgangsbufferen. Hvordan du kan få et håndtag til disse buffere, er beskrevet i MSDN-dokumentationen for 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("
EOF - exiting
");
        } else
            bFinished = true;
    }

    ::SetConsoleMode(hConsole, dwOldMode | ENABLE\_ECHO\_INPUT);
    printf("
Password is: \%s
", password);

    return 0;
}

Andre referencer 2


Da vi er i C ++ og Windows gøres dette:


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


kompileret & testet