-
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
-
getspnam
-
实现密码检查功能
#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);
}