crypt加密是先选择一个盐串(或者叫种子吧),然后对给出的字串进行加密,得到加密后的密文,同时该盐串被置在密文的前面。
而在做验证时,系统先提取出密文,然后把前面几位(一般是两位)作为盐串,再对用户输入的口令进行加密,最后把加密后的字串和系统中的密文相比较,如果一样,就匹配成功,否则就匹配失败,拒绝登录;
crypt函数原型:
char *crypt (const char *key, const char *salt);
一个加密小例子:
#include
#include
#include
#include
int main(void)
{
printf("salt=\"32\",Key = \"123456\", passwd=%s\n",crypt("123456","32"));
printf("salt=\"ab\",Key = \"123456\", passwd=%s\n",crypt("123456","ab"));
printf("salt=\"cd\",Key = \"123456\", passwd=%s\n",crypt("123456","cd"));
printf("salt=\"ef\",Key = \"123456\", passwd=%s\n",crypt("123456","ef"));
printf("salt=\"efgh\",Key = \"123456\", passwd=%s\n",crypt("123456","efgh"));
return 0;
}
编译:
gcc -lcrypt t.c
####不知道为什么要加-lcrypt选项,不过不加就编译不通过,报错说:
####undefined reference to `crypt'
####我想在函数头里已经包括了,就直接编译行了,谁知还非得加那个选项,哪位大侠给解释一下
得到目标文件:a.out
运行a.out得到如下输出:
salt="32",Key = "123456", passwd=32mNiC0FkBR/U
salt="ab",Key = "123456", passwd=ab01FAX.bQRSU
salt="cd",Key = "123456", passwd=cdxkhQyO32K7Q
salt="ef",Key = "123456", passwd=efpp2bUsfJUAU
salt="efgh",Key = "123456", passwd=efpp2bUsfJUAU
大家可以看到密文的前两位是和salt一样的
另外,那个salt并不一定非得是两个字符,如果超过两个字符,也只取前两个,从倒数第一二行可以看出来。
事实上,登录时系统是先取系统中的加密口令,再把那个口令作为盐串送给crypt函数,对用户输入的密码进行加密,然后再和系统中的加密口令相比较。
阅读(2862) | 评论(0) | 转发(0) |