如何在终端中接受密码而不显示密码

时间:2014-01-24 11:33:43

标签: c linux security

我是一名Linux用户,我总是看到无论何时在终端输入密码,系统都会正确接受密码,但密码不会显示。

如何在 C程序中实现此目的?

3 个答案:

答案 0 :(得分:3)

您可以在getpass的帮助下完成此操作。但man getpass

  

此功能已过时。不要使用它。如果要在未启用终端回显的情况下读取输入,请参阅termios(3)中的ECHO标志说明。

此代码可以使用(此代码是其他SO帖子的精确副本)

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <string.h>
int main(int argc, char **argv)
{
    struct termios oflags, nflags;
    char password[128];

    tcgetattr(fileno(stdin), &oflags);
    nflags = oflags;
    nflags.c_lflag &= ~ECHO;
    nflags.c_lflag |= ECHONL;

    if (tcsetattr(fileno(stdin), TCSADRAIN, &nflags) != 0) {
        perror("tcsetattr");
        return -1;
    }
    printf("\npassword(Echo Disabled) : ");
    fgets(password, sizeof(password), stdin);
    password[strlen(password) - 1] = 0;
    printf("Entered password        : %s\n", password);

    if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) {
        perror("tcsetattr");
        return -1;
    }

    printf("\npassword(Echo Enabled)  : ");
    fgets(password, sizeof(password), stdin);
    password[strlen(password) - 1] = 0;
    printf("Entered password        : %s\n", password);

    return 0;
}

解释:

  1. 稍后使用termios structuretcgetattr()中获取终端当前属性以恢复终端属性。
  2. 创建新termios structure并在termios structure成员中设置禁用回显标记。
  3. 使用termios structure从新tcsetattr设置新的终端属性。
  4. 如果要启用回显,请使用tcsetattr再次设置旧保存的终端属性。这是将终端恢复到旧状态
  5. Further detail man tcgetattr

答案 1 :(得分:0)

您可以使用getpass

#include <unistd.h>
...
char *password = getpass("Password: ");
...

答案 2 :(得分:0)

使用getpass()或其他方式

#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;
}