Как показать пароль ввода в виде звездочек (*) на терминале

Я хочу написать простую программу C для проверки password, например, если пароль равен 1234, тогда я хочу напечатать Добро пожаловать else повторите попытку. Но проблема следующая:

Я хочу отобразить пароль ввода в виде * (звезда). , например. Если пользователь введет 1234, он появится как ****, чтобы избежать другого человека, чтобы увидеть введенный пароль.

Может ли кто-нибудь дать мне представление о том, как достичь этого, используя c или С++. Платформа: UNIX

Ответ 1

Решение к этому относится к платформе, к сожалению.

В Linux или BSD вы можете использовать функцию readpassphrase (есть также getpass, хотя он страдает от того, что вызывающий не предоставляет размер буфера и буфера. Документация для GNU Lib C (ссылка сломана? Try эта альтернатива) библиотека также предоставляет превосходное руководство о том, как реализовать это самостоятельно в терминах примитивы termios нижнего уровня, которые вы можете использовать для других реализаций UNIX в режиме getpass).

В Windows вы можете использовать SetConsoleMode, чтобы отключить поведение эха по умолчанию (и, таким образом, эхо ваших собственных символов, таких как звездочка). Затем вы можете использовать SetConsoleMode для восстановления эха.

Я должен добавить, однако, что это очень плохая форма аутентификации, поскольку она включает в себя еще больше паролей, которые являются бичем каждого пользователя (и не особенно безопасны). Лучшим подходом является запуск веб-сервера в вашем приложении и вывод URL, на котором пользователь должен пройти аутентификацию. Преимущество такого подхода заключается в том, что когда пользователь переходит к этому URL-адресу, этот URL-адрес может затем поддерживать делегированный вход в сторонние поставщики удостоверений личности, такие как Google, Facebook, Twitter и т.д. Даже если вы не поддерживаете сторонних поставщиков удостоверений личности, этот подход имеет другие преимущества; если у вас есть другие веб-инструменты, этот подход уменьшает количество попыток аутентификации пользователя (поскольку инструмент командной строки и веб-инструменты будут использовать один и тот же сеанс браузера) и позволяет реализовать поток входа только один раз, этот подход также уменьшает риски фишинга (пользователи могут явно видеть хост в браузере, когда они вводят свои учетные данные, по сравнению с вводом учетных данных в командной строке, где гораздо проще обманывать подсказку и если вы только перенаправляете на localhost на последнем шаге, но выполняете большая часть логики на удаленном хосте, этот подход также позволяет развертывать потоки авторизации независимо от приложения командной строки клиента, которое имеет важные преимущества безопасности. При этом веб-логин, такой как это, не всегда правильный подход. Также стоит изучить альтернативные механизмы аутентификации, такие как libpam (под libpam, вы должны использовать функцию pam_authenticate для аутентификации т.е. пользователь вместо того, чтобы напрямую вводить пароль в качестве входа). Стоит инвестировать некоторые исследования, чтобы определить лучший механизм для вашего конкретного случая использования.

Ответ 2

В Linux и некоторых других Unix-подобных платформах вы можете использовать termios.h для этого. Вам нужно отключить канонический режим эхо-конца для вывода и распечатать * после каждого полученного символа. Пример кода C:

#include <termios.h>

struct termios term;

/* Disable echo input characters and buffered input by disabling ICANON*/
static void disable_echo() {
    struct termios new;
    if (tcgetattr(fileno(stdin), &term) != 0) {
        perror("tcgetattr failed");
        exit(-1);
    }

    new = term;
    new.c_lflag &= ~ICANON;
    new.c_lflag &= ~ECHO;
    if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0) {
        perror("tcsetattr failed");
        exit(-1);
    }
}

/* Enable normal terminal state after getting password*/
static void enable_echo() {
    if (tcsetattr(fileno(stdin), TCSAFLUSH, &term) != 0) {
        perror("tcsetattr failed");
        exit(-1);
    }
}

/* Read password which will be printed as `*` characters */
static void mask_getstr(char* buf, size_t size){
    char c = '\0';
    while (--size > 0 && (c = getchar()) != '\n') {
        *buf++ = c;
        putchar('*');
    }
    *buf = '\0';
}

Ответ 3

    #include<iostream.h>
    #include<stdio.h>
    #include<string.h>
    void main()
    {
     char str[10];
     int i=0,x,y;
     cout<<"enter : ";
     while(1)
      { str[i]=getch();
        if(str[i]==13)
        break;
        if(str[0]==127||str[0]==8)
        continue;
        if(str[i]==127||str[i]==8)
        {
           i--;
           x=wherex();
           y=wherey();
           gotoxy(x-1,y);
           clreol();
         }
         else
         {
           cout<<"*";
           i++;
         }
       }
     if(strcmp(str,"1234")==0)
     cout<<"Welcome";
     else
     cout<<"Try again";
    }