首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在终端上以星号(*)的形式显示输入密码

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

Stack Overflow用户
提问于 2014-09-23 08:59:39
回答 3查看 2.9K关注 0票数 12

我想编写一个简单的C程序来验证password,例如,如果密码等于1234,那么我想再次打印欢迎 else ,再试一次。但问题是:

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-23 09:07:06

不幸的是,解决这个问题的方法是特定于平台的。

在Linux或BSD上,您可以使用重新密码酶函数(也有盖帕斯,尽管它不允许调用方提供缓冲区和缓冲区大小。GNU Lib C的文档(链接断开了?)库还提供了一个很好的指南,说明如何根据更低级别的termios原语来实现这一点,您可以在getpass的lieue中的其他这一种选择实现上使用这些原语)。

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

但是,我要补充的是,这是一种非常糟糕的身份验证形式,因为它涉及更多的密码,这对每个用户的生存都是有害的(而且也不是特别安全)。更好的方法是在应用程序中启动user服务器,并输出用户应该对其进行身份验证的URL。这种方法的优点是,当用户导航到此URL时,该URL可以支持委托给第三方身份提供者(如Google、Facebook、Twitter等)的登录。即使您不支持第三方身份提供者,这种方法也有其他好处;如果您有其他基于web的工具,这种方法减少了用户必须进行身份验证的次数(因为命令行工具和基于web的工具将共享同一个浏览器会话),并且只允许您实现登录流一次,这种方法还可以减少钓鱼风险(与在命令行输入凭据相比,用户输入凭据时可以清楚地看到主机中的主机,因为在命令行上输入提示要容易得多;如果您只在最后一步重定向到本地主机,但在远程主机上执行大部分逻辑),此方法还允许独立于具有重要安全好处的客户端命令行应用程序部署授权流。尽管如此,这样的基于web的登录并不总是正确的方法。还值得研究其他身份验证机制,如libpam (在libpam下,您可以使用函数鉴证对用户进行身份验证,而不是直接将密码作为输入)。值得进行一些研究,以确定特定用例的最佳机制。

票数 19
EN

Stack Overflow用户

发布于 2017-12-27 16:27:49

在Linux和其他类似Unix的平台上,您可以为此使用termios.h。您需要禁用回波结束规范模式的输出和打印后,每个字符*。有C代码示例:

代码语言:javascript
复制
#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';
}
票数 0
EN

Stack Overflow用户

发布于 2016-10-23 13:19:50

代码语言:javascript
复制
    #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";
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25990966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档