获取shadow密码并验证用户输入密码

来源:互联网 发布:西安飞筷网络靠谱 编辑:程序博客网 时间:2024/06/05 06:25
/* ************************************************************************
 *       Filename:  check_password_my.c
 *    Description:  
 *        Version:  1.0
 *        Created:  2014年11月02日 12时39分58秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:  YOUR NAME (), 
 *        Company:  
 * ************************************************************************/


#define _BSD_SOURCE
//#define _XOPEN_SOURCE
extern int errno;


#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <pwd.h>
#include <shadow.h>
int main(int argc, char *argv[])
{
char * username,*password,*encrypted,*p;
struct passwd *pwd;
struct spwd *spwd;
size_t len;
long lnmax;


lnmax = sysconf(_SC_LOGIN_NAME_MAX);//登陆名最大字节数
if(lnmax == -1)
lnmax = 256;


username = malloc(lnmax);
if(username == NULL)
exit(-1);


printf("Username: ");
fflush(stdout);
if(fgets(username,lnmax,stdin) == NULL)//获取登录名
exit(-1);


len = strlen(username);
if(username[len - 1] == '\n')
username[len - 1]= '\0';
pwd = getpwnam(username);//通过用户名获取用户密码
if(pwd == NULL)
exit(-1);



spwd = getspnam(username);//测试shadow文件是不是有效,非空有效
//shadow需要root权限
if(spwd == NULL && errno == EACCES)
{
printf("Use root permission\n");
exit(-1);
}
if(spwd != NULL)
pwd->pw_passwd = spwd->sp_pwdp;


password = getpass("PassWord: ");//获取密码


encrypted = crypt(password,pwd->pw_passwd);//获取加密后的密码
for(p = password;*p != '\0';)
*p ++ = '\0';


if(encrypted == NULL)
{
exit(-1);
}


int ret = strcmp(encrypted,pwd->pw_passwd) == 0;//对比加密后的密码和从shadow文件中获取的密码,若相等则说明验证成功。
printf("ret=%d\n",ret);
if(!ret )
{
printf("Unsuccessfully access\n");
exit(-1);
}
printf("Successfully authenticated :UID=%ld\n",(long)pwd->pw_uid);
exit(0);
return 0;
}
0 0