更好的替代getpassfunction

今天我正在编写一些东西,在某些时候我需要getpass函数,一切都很好,至少在我使用–std = c11之前我得到了:

错误:函数’getpass’的隐式声明[-Werror = implicit-function-declaration] |

在互联网上我发现这个function被认为是过时的:

The getpass() function is not threadsafe because it manipulates global signal state. The getpass() function is scheduled to be withdrawn from a future version of the X/Open CAE Specification. 

所以我不能使用它,至少如果我用–std = c11编译就不行

我试过的程序看起来像这样:

 #include #include #include #include int main(void){ char checkPasswd[BUFSIZ] = "iajsdiajsda32121312asda:ubuntu"; char *checkName = "michi"; char name[25]; char *passwd; char *delimiter; printf("Login Name:\t"); scanf("%24s" ,name); delimiter = strchr(checkPasswd, ':'); delimiter[0] = '\0'; delimiter++; passwd = getpass("Give a passwd:\t"); if(strcmp(name,checkName) == 0){ if(strcmp(passwd,delimiter) == 0){ printf("Logged In\n\n"); }else{ printf("\t\t\tWrong Password\n"); exit(1); } }else{ printf("\t\t\tWrong Name\n"); exit(1); } printf("\t\t\tWelcome %s\n\n", name); return 0; } 

我在这里读了一些东西== >> 在不使用getpass(3)的情况下在C中获取密码? 还有一些答案,但我想知道在我尝试我在那里发现之前是否有一个简单的方法,类似于:

 passwd = getpass("Give a passwd:\t"); 

或者我必须自己创造它?

这个程序不能满足我的需要:

 #include  #include  #include  int main(void){ struct termios oflags, nflags; char password[64]; tcgetattr(fileno(stdin), &oflags); nflags = oflags; nflags.c_lflag &= ~ECHO; nflags.c_lflag |= ECHONL; if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) { perror("tcsetattr"); return EXIT_FAILURE; } printf("password: "); fgets(password, sizeof(password), stdin); password[strlen(password) - 1] = 0; printf("you typed '%s'\n", password); if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) { perror("tcsetattr"); return EXIT_FAILURE; } return 0; } 

所以问题是,我是否必须自己编写或者有替代function?

如果您的终端支持这些转义码,则会隐藏您为密码键入的内容。

 #include  void UserPW ( char *pw, size_t pwsize) { int i = 0; int ch = 0; printf ( "\033[8m");//conceal typing while ( 1) { ch = getchar(); if ( ch == '\r' || ch == '\n' || ch == EOF) {//get characters until CR or NL break; } if ( i < pwsize - 1) {//do not save pw longer than space in pw pw[i] = ch; //longer pw can be entered but excess is ignored pw[i + 1] = '\0'; } i++; } printf ( "\033[0A");//move cursor up one line printf ( "\033[21C");//move cursor 21 places while ( i) { printf ( "*");//overwrite password on screen. this is still concealed i--; } printf ( "\033[28m");//reveal typing } int main ( ) { char password[20]; printf ( "Enter your password: "); fflush ( stdout);//prompt does not have '\n' so make sure it prints UserPW ( password, sizeof ( password));//password array and size printf ( "\nentered [%s]\n", password);//instead of printing you would verify the entered password return 0; } 

让我在你自己的写作中给出一些评论:

getpass()只读取8个字符,所以不要使用它。

自己的代码应该以允许检测用户输入的字符数是否超出预期的方式编写。

filedes.h不存在,不需要。

paswd通常从/ dev / tty或stderr读取。

如果您没有捕获重要信号,代码可能会使tty处于不可用状态。

有关正在运行的实现,请参阅UNIX源代码:

http://sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/src/lib/libc/port/stdio/getpass.c