如何从C/C ++中获取隐藏密码
#编程 #terminal #c #cpp

当他们要求密码时,在某些终端程序中,您是否都感到奇怪,因此它不会显示任何内容或显示'**********'在打字时。

那么这些程序如何获取密码?

默认的终端输入模式是回声的,因此,一旦我们开始在终端中键入任何字符,它同时显示在那里。但是我们可以更改此默认行为以完成我们从终端获取密码的工作。

这是一个简单的程序,可以演示我们如何做到这一点。 termios.h是定义与终端相关的所有结构和功能的标题文件。

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>

int getch() {
    int ch;
    // struct to hold the terminal settings
    struct termios old_settings, new_settings;
    // take default setting in old_settings
    tcgetattr(STDIN_FILENO, &old_settings);
    // make of copy of it (Read my previous blog to know 
    // more about how to copy struct)
    new_settings = old_settings;
    // change the settings for by disabling ECHO mode
    // read man page of termios.h for more settings info
    new_settings.c_lflag &= ~(ICANON | ECHO);
    // apply these new settings
    tcsetattr(STDIN_FILENO, TCSANOW, &new_settings);
    // now take the input in this mode
    ch = getchar();
    // reset back to default settings
    tcsetattr(STDIN_FILENO, TCSANOW, &old_settings);
    return ch;
}

int main(void) {
    char password[100];
    int i = 0;
    int ch;

    printf("Enter password: ");
    while ((ch = getch()) != '\n') {
        if (ch == 127 || ch == 8) { // handle backspace
            if (i != 0) {
                i--;
                printf("\b \b");
            }
        } else {
            password[i++] = ch;
            // echo the '*' to get feel of taking password 
            printf("*");
        }
    }
    password[i] = '\0';

    printf("\nYou entered password: %s\n", password);

    return 0;
}

输出:

Enter password: *****
You entered password: naman

而不是编写整个程序,我们可以使用Inbuild函数getoassunistd.h标头中定义无需回声即可获取密码,但是我们在写作时没有太多的控制权。

#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *password;

    password = getpass("Enter password: ");
    printf("You entered password: %s\n", password);

    return 0;
}

输出:

Enter password:
You entered password: naman

注意: getpass的人页面说函数打开/dev/tty(过程的控制终端),输出字符串提示“密码”),恢复终端状态并再次关闭/dev/tty。,这意味着该密码不会存储在Shell历史记录中。

注意:自定义该程序的实现也不会将密码存储在Shell历史记录中,即使它正在从stdin中获取输入。原因是getch函数直接从终端读取字符而不等待用户按Enter键,因此密码不会以命令传递给Shell。

非常感谢您阅读本文。我也是一个学习新事物的学生,所以如果您发现任何错误或有任何建议,请在评论中告诉我。

另外,如果以任何方式帮助您,请考虑共享并给予大拇指。