獲取shadow密碼並驗證用戶輸入密碼 xK)ib!BdmJYr

/* ************************************************************************
 *       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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章