使用C获取密码而不使用getpass(3)?

我可以使用getpass()来获取密码。 不过,手册页说:

这个function已经过时了。 不要使用它。

目前从用户terminal获取密码的方式是什么,而不是以符合POSIX的方式回显密码? [本来我说的是“可移植的”,但我的意图是避免使用过时的function。]

这应该在linux / macosx上工作,一个Windows版本应该使用Get / Set ConsoleMode

 #include <stdio.h> #include <stdlib.h> #include <termios.h> int main(int argc, char **argv) { struct termios oflags, nflags; char password[64]; /* disabling echo */ 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); /* restore terminal */ if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) { perror("tcsetattr"); return EXIT_FAILURE; } return 0; } 

您可以使用ncurses库从标准input读取而不将结果回显到屏幕。 (在得到任何input之前调用noecho() )。 这个图书馆已经有很多年了,在各种各样的平台上工作(windows版本可以在这里find)

尽pipe这是一个已经被回答的非常古老的问题,以下是我一直在使用的东西(与接受的答案非常相似):

 #include <termios.h> #include <cstdio> // // The following is a slightly modifed version taken from: // http://www.gnu.org/software/libc/manual/html_node/getpass.html // ssize_t my_getpass (char *prompt, char **lineptr, size_t *n, FILE *stream) { struct termios _old, _new; int nread; /* Turn echoing off and fail if we can't. */ if (tcgetattr (fileno (stream), &_old) != 0) return -1; _new = _old; _new.c_lflag &= ~ECHO; if (tcsetattr (fileno (stream), TCSAFLUSH, &_new) != 0) return -1; /* Display the prompt */ if (prompt) printf("%s", prompt); /* Read the password. */ nread = getline (lineptr, n, stream); /* Remove the carriage return */ if (nread >= 1 && (*lineptr)[nread - 1] == '\n') { (*lineptr)[nread-1] = 0; nread--; } printf("\n"); /* Restore terminal. */ (void) tcsetattr (fileno (stream), TCSAFLUSH, &_old); return nread; } // // Test harness - demonstrate calling my_getpass(). // int main(int argc, char *argv[]) { size_t maxlen = 255; char pwd[maxlen]; char *pPwd = pwd; // <-- haven't figured out how to avoid this. int count = my_getpass((char*)"Enter Password: ", &pPwd, &maxlen, stdin); printf("Size of password: %d\nPassword in plaintext: %s\n", count, pwd); return 0; } 

根据密尔沃基大学的文件,它是过时的,因为:

getpass()函数不是线程安全的,因为它操纵全局信号状态。

计划将getpass()函数从未来版本的X / Open CAE规范中撤销。

在Windows上,你可以使用这里描述的SetConsoleMode api。