文件系统-用户密码相关

密码校验:
1、通过UID或name获取用户信息(/etc/passwd)
  struct passwd *getpwnam(const char *name);
  struct passwd *getpwuid(uid_t uid);
 
2、通过gid或grname获取用户组信息(/etc/group)
  struct group *getgrnam(const char *name);
  struct group *getgrgid(gid_t gid);
 
3、通过name获取用户密码信息(/etc/shadow)
  struct spwd *getspnam(const char *name);
  struct spwd *getspent(void);
 
  crypt() //加密函数
  getpass()//获取密码函数
 
 
示例 passwd.c:

#include <stdio.h>
#include <stdlib.h>
#include <shadow.h>
#include <unistd.h>
#include <string.h>

int main(int argc,char **argv)
{
  struct spwd *spwd_line;
  char *passwd_get;
  char *passwd_cal;

  if(argc !=2)
  {
    printf("Usage:%s <username>\n",argv[0]);
    exit(1);
  }

  spwd_line = getspnam(argv[1]);     //读取shadow文件中的argv[1]所在行
  // if(spwd_line == NULL)
  // {
  // perror("getspnma");
  // exit(1);
  // }

  passwd_get = getpass("passwd:");   //取消回显获取密码
  passwd_cal = crypt(passwd_get,spwd_line->sp_pwdp);   //计算密码

  if(strcmp(passwd_cal,spwd_line->sp_pwdp) ==0 )     //加密密码与shadow密码对比
    puts("true");
  else
    puts("false");

  exit(0);
}

 

Makefile:

CFLAGS +=-D_XOPEN_SOURCE     //添加宏定义
LDFLAGS +=-lcrypt          //指定链接库

posted @ 2022-07-07 09:24  *^VV^*  阅读(28)  评论(0编辑  收藏  举报