APUE学习笔记--系统数据文件和信息-(shadow文件、crypt、getspnam、getpass、实现密码检查)

  • shadow文件

    • 存放在/etc/shadow
    • struct spwd {
      char sp_namp; / user login name */
      char sp_pwdp; / encrypted password /
      long int sp_lstchg; /
      last password change /
      long int sp_min; /
      days until change allowed. /
      long int sp_max; /
      days before change required /
      long int sp_warn; /
      days warning for expiration /
      long int sp_inact; /
      days before account inactive /
      long int sp_expire; /
      date when account expires /
      unsigned long int sp_flag; /
      reserved for future use */
      }
      如上定义了shadow文件从前到后各字段的意义。
  • crypt

    • 函数定义

      #define _XOPEN_SOURCE//在gcc编译时,加入-D _XOPEN_SOURCE
      #include <unistd.h>
      Link with -lcrypt. //gcc编译时,得链接这个

      char *crypt(const char *key, const char *salt);

    • 功能描述
      • 从key输入明文密码,通过salt的参数设置,最终返回加密后的密码。

      • salt参数的解释:
        crypt的glibc2版本支持更多的加密算法。
        如果salt是一个以字符串$id$开头,然后紧跟着一个以’$'结尾的字符串。 $id$salt$encrypted

        那么不再使用DES加密算法,id标志使用了哪种加密算法,同时决定了后面密码串怎样被解释。
        支持如下几种id值:

          ID  | Method
        ---------------------------------------------------------
        1   | MD5
        2a  | Blowfish (not in mainline glibc; added in some
            | Linux distributions)
        5   | SHA-256 (since glibc 2.7)
        6   | SHA-512 (since glibc 2.7)
        

    所以$5$salt$encrypted 就是一个SHA-256加密密码,$6$salt$encrypted就是一个SHA-512加密密码。
    "$id$"后的salt字段最多十六个字符。最后的encrypted部分才是真正被加密的密码。这个加密串的大小是固定的:

    MD5     | 22 characters
    SHA-256 | 43 characters
    SHA-512 | 86 characters
    

    “salt” 和"encrypted"可选取的字符限定于[a–zA–Z0–9./]。MD5和SHA加密算法加密整个key,不再像DES一样只加密八个byttes。

  • 返回值

    成功,返回一个包含加密密码的字符串指针。失败,返回NULL。

  • getpass

    • 函数定义
      #include <unistd.h>
      char *getpass( const char *prompt);
    • 功能描述
      这个函数返回一个静态存储区的指针,内含没有末尾换行符的密码,以’\0’结尾。这个buffer能被下一次调用覆盖。如果出错了,则终端重启,设置相应的errno,返回NULL。
  • getspnam

    • 函数定义

      #include <shadow.h>

      struct spwd *getspnam(const char *name);

    • 函数功能

      通过用户名(name),返回该用户在shadow文件中的那行信息。那行信息存储在 struct spwd结构体中。

    • 返回值

      成功返回结构体信息,失败返回NULL。

  • 实现密码检查功能

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

//#define _XOPEN_SOURCE
#include <unistd.h>
#include <string.h>


int main( int argc,char ** argv)
{
	char * input_line;
	struct spwd *  shadowLine;
	char * crypted_pass;
	if(argc != 2)
	{
		fprintf(stderr,"Usage----");
		exit(1);
	}
	
	input_line = getpass("password");//用户手动输入密码明文
	shadowLine = getspnam(argv[1]);//获得该用户的shadow信息

	crypted_pass = crypt(input_line,shadowLine->sp_pwdp);//利用shadow信息把密码明文加密
	if(strcmp(crypted_pass,shadowLine->sp_pwdp) == 0 ) //比较加密后的密码与存储在shadow中的密码是否一致
		printf("OK");
	else
		printf("failure");
	exit(0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值