Введите пароль в C - PullRequest
       15

Введите пароль в C

10 голосов
/ 14 апреля 2010

Я знаю, что невозможно отобразить *, когда вы печатаете в стандартном ANSI C. Но есть ли способ ничего не отображать, пока кто-то набирает их пароль в консоли. Я имею в виду что-то вроде запросов sudo в терминале Unix / Linux. Например, если вы введете команду: sudo cp /etc/somefile ~/somedir. Обычно вам предлагается ввести пароль root. И пока вы набираете его, терминал ничего не отображает. Возможен ли этот эффект в C? Если да, то как?

Ответы [ 4 ]

9 голосов
/ 14 апреля 2010

Функция, которую вы ищете: getpass () .Тем не менее, вы заметите, что он помечен как "LEGACY".Хотя это никуда не денется, функция не позволяет указать размер входного буфера, что делает его не очень хорошим интерфейсом.Как отметил Джефроми, руководство по glibc предоставляет переносимый пример кода для реализации getpass с нуля таким образом, который допускает произвольный размер ввода (и не LEGACY).

2 голосов
/ 14 апреля 2010

sudo написано на C, так что да :). getpass() функция Safyan , о которой говорилось , вероятно, то, что вы хотите, но вот где настоящий инструмент sudo делает это, если вам интересно:

http://sudo.ws/repos/sudo/file/dc3bf870f91b/src/tgetpass.c#l70

1 голос
/ 14 апреля 2010

Метод бедняков заключается в том, чтобы читать вводимые пользователем символы за символом, и после получения каждого символа выводить символ возврата на одну позицию, за которым следует *. Технически выходные данные отправляются на консоль, но сразу же стираются и перезаписываются звездочкой (часто еще до того, как этот кадр выводится на экран). Обратите внимание, что это не совсем безопасный метод и имеет несколько дыр в безопасности, но для низкотехнологичных приложений с низким уровнем защиты он работает.

0 голосов
/ 14 апреля 2010

* Это не ANSI C (спасибо Билли) образец

Вы можете обнаружить нажатие клавиши с помощью _kbhit (), а затем получить значение с помощью _getch (). Обе функции не будут отображать содержимое на экране.

#include <conio.h>          //For keyboard events
#include <stdio.h>          //Include this or iostream
#include <locale>           
int main()
{
    bool bContinue = true;
    char szBuffer[255] = {0};
    unsigned int nbufIndex = 0;
    while (bContinue)
    {
        if (_kbhit())
        {
            szBuffer[nbufIndex] = _getch();
            if (szBuffer[nbufIndex] == 0xD)
            {
                bContinue = false;
            }
            else
            {
                ++nbufIndex;
                printf("*");
            }
        }
    }
    printf("\n%s\n", szBuffer);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...