社区
系统维护与使用区
帖子详情
!!有知道过linux下面的那个crypt函数怎么实现的吗?那儿有它的源代吗 for win?
AttaBoy
2001-07-05 10:20:53
加精
谢谢谢谢谢。
...全文
125
2
打赏
收藏
!!有知道过linux下面的那个crypt函数怎么实现的吗?那儿有它的源代吗 for win?
谢谢谢谢谢。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
AttaBoy
2001-07-05
打赏
举报
回复
谢谢了
可我只是想要一个和linux下面加密效果一模一样的函数(因为要做两套东西,一个在linux下,下,一个在win下),能在win下面用,
sbhnet
2001-07-05
打赏
举报
回复
crypt
crypt是个密码加密函数,它是基於DataEncryptionStandard(DES)演算法。
crypt基本上是Onewayencryption,因此它只适用於密码的使用,不适合於资料加密。
char*crypt(constchar*key,constchar*salt);
key是使用者的密码。salt是两个字,每个字可从[a-zA-Z0-9./]中选出来,因此同一密码增加了4096种可能性。透过使用key中每个字的低七位元,取得56-bit关键字,这56-bit关键字被用来加密成一组字,这组字有13个可显示的ASCII字,包含开头两个salt。
crypt在您有自行管理使用者的场合时使用,例如会员网站、BBS等等。
范例一:crypt_word.c
#include
#include
#include
voidmain(intargc,char**argv)
{
if(argc!=3)exit(0);
printf("%sn",crypt(argv[1],argv[2]));
}
编译
gcc-ocrypt_wordcrypt.c-lcrypt
检验
请先看您的/etc/passwd,找一个您自己的帐号,看前面两个字,那是您自己的salt。接下来输入:
./crypt_wordyour_passwordsalt
看看它们是否相同(应该要相同,除非您加了cryptplugin或使用不同的crypt
function,例如shadow、pam,这种状况下,加密字是不同的),另外检验看看他们是否为13个字。
您也可以利用Apache上所附的htpasswd来产生加密字做为验证。
范例二:verify_passwd.c
注意,这个范例读取/etc/passwd的资料,不适用於使用shadow或已经使用pam的系统(例如slackware,RedHat及Debian在不外加cryptplugin的状况下,应当相同)。此范例仅供叁考,做为了解crypt函数运作的情形,真正撰写程式时,应该避免类似的写法。
#include
#include
#include
typedefstruct{
charusername[64];
charpasswd[16];
intuid;
intgid;
charname[256];
charroot[256];
charshell[256];
}account;
/*注意!以下的写法,真实世界的软体开发状况下,千万不要用!*/
intacc_info(char*info,account*user)
{
char*start=info;
char*now=info;
/*username*/
while(*now&&*now!=:)now++;/*这是超级大安全漏洞*/
if(!*now)return0;
*now=0;now++;
strcpy(user->username,start);/*这会导致bufferoverflow*/
start=now;
/*passwd*/
while(*now&&*now!=:)now++;/*这是超级大安全漏洞*/
if(!*now)return0;
*now=0;now++;
strcpy(user->passwd,start);/*这会导致bufferoverflow*/
start=now;
/*uid*/
while(*now&&*now!=:)now++;
if(!*now)return0;
*now=0;now++;
user->uid=atoi(start);
start=now;
/*gid*/
while(*now&&*now!=:)now++;
if(!*now)return0;
*now=0;now++;
user->gid=atoi(start);
start=now;
/*name*/
while(*now&&*now!=:)now++;/*这是超级大安全漏洞*/
if(!*now)return0;
*now=0;now++;
strcpy(user->name,start);/*这会导致bufferoverflow*/
start=now;
/*root*/
while(*now&&*now!=:)now++;/*这是超级大安全漏洞*/
if(!*now)return0;
*now=0;now++;
strcpy(user->root,start);/*这会导致bufferoverflow*/
start=now;
/*shell*/
while(*now&&*now!=:)now++;/*这是超级大安全漏洞*/
*now=0;now++;
strcpy(user->shell,start);/*这会导致bufferoverflow*/
start=now;
return1;
}
intread_password(char*filename,account*users)
{
FILE*fp;
charbuf[1024];
intn;
n=0;
fp=fopen(filename,"rt");
while(fgets(buf,1024,fp)!=NULL){
if(acc_info(buf,&users[n]))n++;
}
fclose(fp);
returnn;
}
voidmain(intargc,char**argv)
{
intn,i,done;
accountACC[128];
charusername[256];
charpassword[256];
char*passwd;
charsalt[4];
if(argc<2){
printf("username:");
scanf("%s",username);/*这是超级大安全漏洞*/
}elsestrcpy(username,argv[1]);/*这是超级大安全漏洞*/
if(argc<3){
printf("password:");
scanf("%s",password);/*这是超级大安全漏洞*/
}elsestrcpy(password,argv[2]);/*这是超级大安全漏洞*/
n=read_password("/etc/passwd",ACC);
for(i=0,done=0;ibr>
if(strcmp(username,ACC[i].username)==0){
salt[0]=ACC[i].passwd[0];
salt[1]=ACC[i].passwd[1];
salt[2]=0;
passwd=crypt(password,salt);
printf("%s%s%sn",ACC[i].username,ACC[i].passwd,passwd);
if(strcmp(passwd,ACC[i].passwd)==0){
printf("loginsuccessfully!n");
}else{
printf("incorrectpassword!n");
}
done=1;
}
if(!done)printf("invalidusername!n");
}
编译
gcc-overify_passwdverify_passwd.c-lcrypt
检验
./verify_passwdyour_usernameyour_password
避免安全漏洞
bufferoverflow是个很严重的安全漏洞,通常您不可使用像charbuf[xxxx]的宣告。在这一类与安全有相关的任何程式写作中(不是只有密码,例如像www/ftp/telnet的这一类对外窗口都要算在内),您应该要先检查字串长度。例如以下例子:
len=strlen(incoming_username);
if(len>xxx)invalid;
new_string=(char*)malloc(len+1);
strcpy(new_string,incoming_username);
your_own_operations...
如此才能避免bufferoverflow,万万不可滥做假设,切记切记,连许多数十年经验丰富的老手都会犯这个错误。
与crypt函数相关者尚有以下三个:
voidsetkey(constchar*key);
voidencrypt(char*block,intedflag);
voidswab(constchar*from,char*to,ssize_tn);
一般来说,除非您有特殊需求,你不会用到这三个。
vc++ 应用源码包_1
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上
实现
3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
vc++ 应用源码包_2
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上
实现
3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
vc++ 应用源码包_6
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上
实现
3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
vc++ 应用源码包_5
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上
实现
3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
vc++ 应用源码包_3
压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上
实现
3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...
系统维护与使用区
19,620
社区成员
74,588
社区内容
发帖
与我相关
我的任务
系统维护与使用区
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
复制链接
扫一扫
分享
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章