当前位置:  技术问答>linux和unix

!!有知道过linux下面的那个crypt函数怎么实现的吗?那儿有它的源代吗 for win?

    来源: 互联网  发布时间:2014-10-27

    本文导语:  谢谢谢谢谢。 |crypt  crypt是个密码加密函数,它是基於DataEncryptionStandard(DES)演算法。    crypt基本上是Onewayencryption,因此它只适用於密码的使用,不适合於资料加密。    char*crypt(constchar*key,constcha...

谢谢谢谢谢。

|
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(argcxxx)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);    一般来说,除非您有特殊需求,你不会用到这三个。   

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有知道RFC中关于邮件接收的协议吗???急急急急!
  • 谁有知道tempfile命令在哪个包里面吗,在redhat里面
  • 有知道关于Javabeans与html的么?(高分!)
  • to;zlj2000(我想飞)兄:我用netstat -a 查看了是Tcp协议占用了7001和7002端口,可是我不知道怎么改动它,有知道的都可回答。马上给分! 
  • 我的載linux9.0下面安裝oracle8.1遇到問題﹐runInstaller的時候的問題﹐希望有知道的賜教﹗


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    linux iis7站长之家