Хранение паролей при сохранении целостности getch () - PullRequest
2 голосов
/ 21 декабря 2010

Какой простой способ сохранить пароль, введенный пользователем, при этом сохраняя пароль скрытым?

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

Я хочу сохранить пароль, чтобы я мог сделать простой if (password[i] == root_password), чтобы правильный пароль продолжался.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2010

Вам необходимо использовать консольный API в Windows.Ниже приведен фрагмент, который отключает эхо в окне консоли.Функция SetConsoleMode() используется для управления эхом (среди прочего).Я сохраняю старый режим, чтобы после восстановления пароля я мог восстановить консоль.

Кроме того, для функций *ConsoleMode() требуется дескриптор буфера ввода консоли.Как получить управление этими буферами, описано в документации MSDN 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 голосов
/ 01 января 2011

Поскольку мы находимся в C ++ и Windows, сделайте это:

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

скомпилировано и протестировано

0 голосов
/ 21 декабря 2010

Похоже, ваша проблема в том, что вы не проверяете ни новую строку '\ n', ни конец файла.

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

Таким образом, пароль в конечном итоге станет строкой ASCIIZ, пригодной для печати с puts, printf("%s", password) или - что крайне важно ...

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

Обратите внимание, что мы читаем не более 8 символов в пароле, поскольку нам нужен один дополнительный символ для терминатора NUL. Вы можете увеличить это, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...