获取shadow密码并验证用户输入密码 xK)ib!BdmJYr

本文详细介绍了如何通过用户输入的用户名和密码进行身份验证,包括获取用户信息、检查密码有效性以及使用加密算法确保安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* ************************************************************************
 *       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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值