Linux C:如何隐藏密码输入的星号? (linux c 密码 星号)
在开发 Linux 应用程序时,常常需要读取用户输入的密码。通常情况下,我们往往会使用 Linux 系统提供的 getch() 函数来读取用户输入的字符,但是这种方式在输入密码时会暴露用户的密码,不仅不安全,并且用户的输入也不够隐私。为了保障用户的密码安全,本文将介绍如何隐藏密码输入的星号。
1. 读取密码的函数
在 Linux C 开发中,我们通常会使用 GCC 来编写代码,在读取密码的过程中,我们可以使用 termios.h 头文件中的属性,而在 Ubuntu 14.04 安装包中,它已经默认集成,因此我们可以直接使用该头文件中的函数实现密码的读取,代码如下:
“`
#include
#include
#include
#include
int getch(void)
{
struct termios tm, tm_old;
int fd = STDIN_FILENO, c;
if (tcgetattr(fd, &tm)
return -1;
}
tm_old = tm;
cfmakeraw(&tm);
if (tcsetattr(fd, TCSANOW, &tm)
return -1;
}
c = getchar();
if (tcsetattr(fd, TCSANOW, &tm_old)
return -1;
}
return c;
}
void getpassword(char *password,int size)
{
int i = 0, ch;
while ((ch = getch()) != ‘\n’)
{
if(ch != ‘\t’ && ch != ‘\b’ && i
{
putchar(‘*’);
*(password + i++) = ch;
}
else if(ch == ‘\b’ && i > 0)
{
putchar(‘\b’);
putchar(‘ ‘);
putchar(‘\b’);
i–;
}
}
*(password + i) = ‘\0’;
}
“`
在代码中,getch() 函数是读取字符的函数,其中使用了 Linux 的 terminals 模块来获得输入字符,这个结构体包含了一系列的常量,如带宽速率、奇偶检验、流控制和硬件控制。通过设备文件文件描述符 fd(设置为 STDIN)来获取终端的属性,然后把该函数阻塞并打开,使用 cfmakeraw(&tm) 设置它为非规范模式,使得输入输出数据直接发送和接收,就像开发实时应用程序一样。最后返回读取到的字符。
getpassword() 函数通过 getche() 函数来避免了明文输入密码的情况,并在每一次输入完一个字符之后输出一个星号,从而避免了明文显示密码的情况。
2. 调用函数实现密码输入
在我们完成上述的代码之后,我们可以使用它来进行密码的输入,然后将其发送到服务器。代码如下:
“`
int mn()
{
char password[10];
printf(“Please enter password: “);
getpassword(password,10);
printf(“\nYour password is %s “, password);
return 0;
}
“`
在代码中,我们可以看到,首先像命令行提示用户输入密码,然后通过调用 getpassword() 函数来读取和隐藏密码,并最后输出结果。
3.