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

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

10
задан Mohit Deshpande 14 April 2010 в 00:53
поделиться

4 ответа

Функция, которую вы ищете: getpass () . Однако вы заметите, что он помечен как «НАСЛЕДИЕ». Хотя она никуда не денется, функция не позволяет указывать размер входного буфера, что делает ее не очень хорошим интерфейсом. Как отметил Джефроми, руководство по glibc предоставляет переносимый пример кода для реализации getpass с нуля способом, который позволяет вводить произвольный размер (и не является LEGACY).

9
ответ дан 4 December 2019 в 00:23
поделиться

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

1
ответ дан 4 December 2019 в 00:23
поделиться

* Это не 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;
}
0
ответ дан 4 December 2019 в 00:23
поделиться

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

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

2
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: