Linux下用c语言编写输入密码程序

时间:2021-12-11 00:55:48
怎么在linux下用c编写个输入密码的程序,而且是不能回显密码的那种程序!!!求指点啊!!!

7 个解决方案

#1


getpass(3)

#2


引用 1 楼 yq_118 的回复:
getpass(3)

这个不好用的 我试过了

#3


那就用加密算法。

#4


记得在windows下getch();
在linux你可以写一个类似
#include<iostream>
#include<termios.h>
#include<stdio.h>
namespace getch_name{
char getch(void)
{
char buf = 0;
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
if (read(0, &buf, 1) < 0)
perror ("read()");
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(0, TCSADRAIN, &old) < 0)
perror ("tcsetattr ~ICANON");
return (buf);
}
}//命名空间到结束

#5


去找找设置终端的函数。

#6


要是对安全要求不是很高的话:
1)如果是在终端下,用ncurses库制作一个密码输入窗;
2)如果是图形界面,首先截获键盘输入事件,替换有效的输入显示为*;
在网上搜搜,很多ncurse库做密码输入的例子;

如果对安全要求很高,要考虑密码不被截获,这就复杂了,可以研究的有:
1)防止使用 Ttyutils截获UNIX/Linux终端;
2)参考cpm(Console Password Manager)的代码;

#7


多谢大家,先附上源码
#include<stdio.h>
#include<stdlib.h>
#include<termios.h>
int mygetch()
{
struct termios oldt,newt;
int ch;
tcgetattr(STDIN_FILENO,&oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON |ECHO);
tcsetattr(STDIN_FILENO,TCSANOW,&newt);
ch = getchar();
tcsetattr(STDIN_FILENO,TCSANOW,&oldt);
return ch;
}

void getpasswd(char password[])
{
int len = 0;
int flag;
char c;
while(1)
{
flag = 1;
c = mygetch();
if(c == '\n')
{
password[len]='\0';
printf("\n");
break;
}
if(c == 127)
{
printf("\b");
flag=0;
len--;
}
if(flag)
{
password[len++]=c;
printf("*");
}
}
}

#1


getpass(3)

#2


引用 1 楼 yq_118 的回复:
getpass(3)

这个不好用的 我试过了

#3


那就用加密算法。

#4


记得在windows下getch();
在linux你可以写一个类似
#include<iostream>
#include<termios.h>
#include<stdio.h>
namespace getch_name{
char getch(void)
{
char buf = 0;
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
if (read(0, &buf, 1) < 0)
perror ("read()");
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(0, TCSADRAIN, &old) < 0)
perror ("tcsetattr ~ICANON");
return (buf);
}
}//命名空间到结束

#5


去找找设置终端的函数。

#6


要是对安全要求不是很高的话:
1)如果是在终端下,用ncurses库制作一个密码输入窗;
2)如果是图形界面,首先截获键盘输入事件,替换有效的输入显示为*;
在网上搜搜,很多ncurse库做密码输入的例子;

如果对安全要求很高,要考虑密码不被截获,这就复杂了,可以研究的有:
1)防止使用 Ttyutils截获UNIX/Linux终端;
2)参考cpm(Console Password Manager)的代码;

#7


多谢大家,先附上源码
#include<stdio.h>
#include<stdlib.h>
#include<termios.h>
int mygetch()
{
struct termios oldt,newt;
int ch;
tcgetattr(STDIN_FILENO,&oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON |ECHO);
tcsetattr(STDIN_FILENO,TCSANOW,&newt);
ch = getchar();
tcsetattr(STDIN_FILENO,TCSANOW,&oldt);
return ch;
}

void getpasswd(char password[])
{
int len = 0;
int flag;
char c;
while(1)
{
flag = 1;
c = mygetch();
if(c == '\n')
{
password[len]='\0';
printf("\n");
break;
}
if(c == 127)
{
printf("\b");
flag=0;
len--;
}
if(flag)
{
password[len++]=c;
printf("*");
}
}
}