如何在终端上显示星号(*)形式的输入密码

how to show enter password in the form of Asterisks(*) on terminal

本文关键字:密码 输入 终端 显示      更新时间:2023-10-16

我想写一个简单的C程序来验证password,例如,如果密码等于1234,那么我想打印欢迎否则请重试。但问题如下:

我想以 *star)的形式显示输入密码。例如。。如果用户输入1234,它将显示为****,以避免其他人看到输入的密码。

有人能告诉我如何使用c或c++来实现它吗。平台:UNIX

不幸的是,这方面的解决方案是特定于平台的。

在Linux或BSD上,您可以使用readpassphrase函数(还有getpass,尽管它不允许调用方提供缓冲区和缓冲区大小。GNU Lib C(链接已断?请尝试此替代方案)库的文档也提供了一个很好的指南,说明如何在较低级别的termios基元中自己实现这一点,您可以在getpass的其他UNIX实现中使用它)。

在Windows上,您可以使用SetConsoleMode禁用默认的回显行为(从而回显您自己的字符,如星号)。然后,您可以使用SetConsoleMode来恢复回显。

然而,我应该补充一点,这是一种非常糟糕的身份验证形式,因为它涉及更多的密码,这些密码是每个用户存在的祸根(也不是特别安全)。更好的方法是在应用程序中启动一个Web服务器,并输出用户应该进行身份验证的URL。这种方法的优点是,当用户导航到此URL时,该URL可以支持委托登录到第三方身份提供商,如谷歌、脸书、推特等。即使你不支持第三方识别提供商,这种方法也有其他好处;如果你有其他基于web的工具,这种方法可以减少用户必须进行身份验证的次数(因为命令行工具和基于web的软件将共享同一个浏览器会话),并且只允许你实现一次登录流,这种方法还降低了网络钓鱼的风险(与在命令行上输入凭据相比,用户在输入凭据时可以在浏览器中清楚地看到主机,在命令行中伪造提示要容易得多。如果在最后一步只重定向到localhost,但在远程主机上执行大部分逻辑,则这种方法还允许独立于客户端命令行ap部署授权流的更新具有重要安全优势的应用程序。也就是说,像这样基于网络的登录并不总是正确的方法。还值得研究其他身份验证机制,如libpam(在libpam下,您可以使用函数pam_authenticate对用户进行身份验证,而不是直接将密码作为输入)。值得投资一些研究来确定适合您特定用例的最佳机制。

在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 = '';
    while (--size > 0 && (c = getchar()) != 'n') {
        *buf++ = c;
        putchar('*');
    }
    *buf = '';
}
    #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";
    }