1. 程式人生 > >模擬密碼登陸過程

模擬密碼登陸過程

結構體指針 name login pan tty check 數組 tde gin

知識點:

1.當查看手冊發現頭文件上面有宏定義的要在文件程序的最上方加上該宏定義。

2用到的函數:

  getpwnam(name);//根據用戶輸入的name來查找passwd表,看是否有該用戶

  getspnam(name)//通過用戶名在shadow中找到該用戶的密鑰,返回的是結構體指針

  crypt(pas.sp->sp_pwdp)//通過crypt函數校驗密碼,用輸入的密碼和密鑰用相同的算法進行加密,返回新密鑰

3.步驟

  3.1 用戶輸入帳號和密碼,用兩個數組進行保存;

  3.2 調用getpwnam()函數判斷passwd表中是否存在該用戶(存在則繼續,否則退出)

  3.3 調用getspnam(name)函數,根據name在shadow表中找到存放該數據的表象,並返回結構體指針

  3.4 調用crypt(新密碼,密鑰)函數對用戶輸入的密碼按照和3.3求得 的密鑰相同的算法加密,返回新密鑰;

  3.5 將3.4求得的密鑰與原密鑰通過strcmp(s1,s2)函數進行比較,形同則密碼正確,用戶可以進入。否則報錯。

4.示例代碼如下

#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <pwd.h>
#include <shadow.h>
#include <unistd.h>

#define SIZE 4096

int main(void)
{
char *t,name[SIZE],pas[SIZE];

system("clear");

//read user name and passwd from stdin
printf("login:");
fgets(name,SIZE,stdin);
t=strchr(name,‘\n‘);
if(t) *t=‘\0‘;//del ‘\n‘

system("stty -echo");
printf("passwd:");
fgets(pas,SIZE,stdin);
t=strchr(pas,‘\n‘);
if(t) *t=‘\0‘;//del ‘\n‘
system("stty echo");
putchar(‘\n‘);

//check user and passwd
struct passwd *pw;
pw=getpwnam(name);
if(pw==NULL)
{
fprintf(stderr,"user not exist or passwd error!\n");
return 1;
}
//讀出密鑰 shadow sp->sp_pwdp
struct spwd *sp;
sp=getspnam(name);
if(sp==NULL)
{
fprintf(stderr,"error!!!!!\n");
return 2;
}
//通過crypt函數校驗密碼:用輸入的密碼與密鑰用相同的算法進行加密,返回新的密鑰
char *ret;
//Link with -lcrypt
ret=crypt(pas,sp->sp_pwdp);
if(ret==NULL)
{
fprintf(stderr,"error!!!!!\n");
return 3;
}
//
if(strcmp(ret,sp->sp_pwdp)==0)
{
printf("login success.\n");
}
else
{
fprintf(stderr,"user not exist or passwd error!\n");
}


return 0;
}

模擬密碼登陸過程