唐山网站建设

设为主页 加入收藏 繁體中文

应用CrackLib构建安全的Unix口令

核心提示:作为Internet上最流行的服务器操纵系统,UNIX安全性倍受关注。

作为Internet上最流行的服务器操纵系统,UNIX安全性倍受关注。Unixd的安全性主要靠口令实现,因此,Unix口令加密算法几度改进,现在普遍采取DES算法对口令文件进行25次加密,而对每次DES加密产生的结果,都要用2的56次方次查找与匹配才能进行1次遍历,要破解这样的口令,其工作量是巨大的,所以从理论上说这类口令是相当安全的。但是不幸的是我们依然不时听道口令被攻破的消息。这些口令是如何被攻破的,我们又怎样才能保证口令的安全呢。下面将对这1题目进行探讨。

Unix口令文件的格式及安全机制

Unix的口令文件passwd是1个加密后的文本文件,贮存在/etc目录下。该文件用于用户登录时校验用户的口令,仅对root权限可写。口令文件中每行代表1个用户条目,格式为:LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL。每行的头两项是登录名和加密后的口令,UID和GID是用户的ID号和用户所在组的ID号,USERINFO是系统治理员写进的有关该用户的信息,HOME是1个路径名,是分配给用户的主目录,SHELL是用户登录后将履行的shell(若为空格则缺省为/bin/sh)。目前多数Unix系统中,口令文件都做了Shadow变换,即把/etc/passwd文件中的口令域分离出来,单独存在/etc/shadow文件中,并加强对shadow的保护,以增强口令安全。

Unix系统使用1个单向函数crypt()来加密用户的口令。Crypt()是基于DES的加密算法,它将用户输进的口令作为密钥,加密1个64bit的0/1串,加密的结果又使用用户的口令再次加密;重复该进程,1共进行25次。最后的输出为1个13byte的字符串,寄存在/etc/passwd的PASSWORD域。单向函数crypt()从数学原理上保证了从加密的密文得到加密前的明文是不可能的或是非常困难的。当用户登录时,系统其实不是往解密已加密的口令,而是将输进的口令明文字符串传给加密函数,将加密函数的输出与/etc/passwd文件中该用户条目的PASSWORD域进行比较,若匹配成功,则答利用户登录系统。

口令破解原理

口令破解通常有蛮力攻击和字典攻击两种方式。Unix中1共有[0x00~0xff]共128个字符,其中95个字符(10(数字)+33(标点符号)+26*2(大小写字母))可作为口令的字符。假定m为可能使用的字符集的大小,n为口令的长度,则可天生的口令数为m的n次幂,随着字符集的扩大与口令长度的增加,口令攻击尝试次数将迅速增加。如口令长度为6,取字母和数字组合,可能性是62的6次幂56,800,235,584。但假设5个字母是1个常常使用汉字的拼音或英文单词,估算1下常常使用词约为10000条,从10000个常常使用词中取1个词与任意1个数字字符组合成口令,则仅10000*10=100000(10万种可能)。在口令的设置进程中,还有很多个人因素在起作用,为使自己的口令轻易记忆,很多人常常将个人的姓名、生日、电话号码、街道的号码等作为口令,这样便为口令的破解留下了方便之门。贝尔实验室的计算机安全专家R.Morris和K.Thompson提出了这样1种攻击的可能性:可以根据用户的信息建立1个他可能使用的口令的字典。比如:他父亲的名字、女朋友的生日或名字,街道的名字等等。然后对这个字典进行加密,每次拿出1个经过加密计算的条目与口令文件比较,若1致,口令就被猜到了。或许有人以为口令毫无规律可言,字典中不会有,计算机是破译不了的,那就大错特错了。有很多专门天生字典的程序,比如:Dictmake、txt2dict、xkey等等。以dictmake为例:启动程序后,计算机会要求输进最小口令长度、最大口令长度、口令包括的小写字符、大写字符、数字、有无空格、含不含标点符号和特殊字符等1系列的题目。当回答完了计算机提出的题目后,计算机就会依照给定的条件自动将所有的组合方式列出来并存到文件中,而这个文件就是资料字典。目前,在因特网上,有1些数据字典可以下载,包括的条目从1万到几10万条。数据字典1般包括了常常使用的单词。攻击者1旦通过某种途径取得了passwd文件,破译进程便只需1个简单的C程序即可完成。Unix中有1组子程序可对/etc/passwd文件进行方便的存取。getpwuid()函数可从/etc/passwd文件中获得指定的UID的进口项。getpwnam()函数可在/etc/passwd文件中获得指定的登录名进口项。这两个子程序返回1指向passwd结构的指针,该结构定义在/usr/include/pwd.h中,定义以下:

以下为援用的内容:
  structpasswd{
  char*pw_name;/*登录名*/
  char*pw_passwd;/*加密后的口令*/
  uid_tpw_uid;/*UID*/
  gid_tpw_gid;/*GID*/
  char*pw_age;/*代理信息*/
  char*pw_comment;/*注释*/
  char*pw_gecos;
  char*pw_dir;/*主目录*/
  char*pw_shell;/*使用的shell*/
  char*pw_shell;/*使用的shell*/
  }

getpwent(),setpwent(),endpwent()等函数可对口令文件作后续处理。首次调用getpwent()可打开/etc/passwd文件并返回指向文件中第1个用户条目的指针,再次调用getpwent()即可顺序地返回口令文件中的各用户条目,setpwent()可把口令文件的指针重新置为文件的开始处,endpwent()可封闭口令文件。

因而可知,攻击者只需建立1个字典文件,然后调用现成的cryp()加密例程来加密字典文件中的每1条目,再用上述函数打开口令文件,进行循环比较就很轻易破解密码了。

实际上Internet网上有很多现成的密码破解软件工具,过于简单的口令很轻易破解。那末,我们用甚么方法来保证用户口令是1个安全的口令呢?应用CrackLib来构建安全的Unix口令是1个较好的办法。

CrackLib原理及利用

CrackLib是1个用于UNIX系统下的函数库,它可以用于编写和口令有关的程序。其基本思想就是通过限制用户使用使用过于简单、轻易被猜想出来或轻易被1些工具搜索到的密码,来进步系统的安全性。

CrackLib其实不是1个可以直接运行使用的程序,它只是1个函数库,可以利用其中的函数写自己的程序或是加进其它程序中以进步安全性,如可以改写passwd使用户在选择密码时遭到限制。CrackLib使用1个字典,它查找字典以判定用户所选密码是否是安全的密码。用户也能够加进其它信息,使用自己的字典。CrackLib通过建立索引和2元查找,效率非常高,其字典大小通常只有同等字典数的1半。下面先容如何应用CrackLib。

1、构建cracklib字典

CrackLib可以很轻易的在Internet上找到,现在使用的版本多是2.7,首先要肯定字典安装的路径,即给DICTPATH赋值,情势为:目录+字典文件名(不包括后缀),如:DICTPATH=/usr/local/lib/pw_dict.。该变量值将在所有调用CrackLib函数的程序中用到,字典文件通常包括/usr/local/lib/pw_dict.pwd,/usr/local/lib/pw_dict.pwi,/usr/local/lib/pw_dict.hwm3个文件。

CrackLib字典可直接从网上下载,也能够用它提供的工具天生。假设想加进其它信息,使用自己的字典,可将含有新词的文件放到SOURCEDICT目录如"/usr/dict/words"下,CrackLib会将所有文件合并起来,删除过剩的词,将其紧缩成字典文件,通常只有原文件40%⑹0%的大小。

2、在程序中调用函数

CrackLib函数可以被利用于很多地方,只需加进简单的几行源码,便可以够得到非常好的效果。char*FascistCheck(char*pw,char*dictpath)是CrackLib中最常常使用的函数。其中pw是用户选择的密码,将被验证是否是安全的,dictpath是字典所在路径。

FascistCheck()返回1个空指针,说明口令很安全,否则返回诊断出的字符串。下面是1个口令设置的简单示例,用以说明CrackLib函数用法.

以下为援用的内容:
  #ifndefCRACKLIB_DICTPATH
  #defineCRACKLIB_DICTPATH"/usr/local/lib/pw_dict"
  #endif
  ...
  ...
  ...
  char*msg;
  while(1){
  passbuf=getpass("请设定新密码:");
  if(!*passbuf){
  (void)printf("密码设定取消,继续使用旧密码\n");
  break;
  }
  if(strlen(pussbuf)<=4││!strcmp(passbuf,newuser.userid)){
  (void)printf("密码太短或与使用者代号相同,请重新输进\n");
  continue;
  }
  if(msg=(char*)FascistCheck(passbuf,CRACKLIBPATH)){
  printf("请另选密码!(%s)\n",msg);
  continue;
  }
  strncpy(newuser.passwd,passbuf,PASSLEN);
  passbuf=getpass("请再输进1次你的密码);
  if(strncmp(passbuf,newuser.passwd,PASSLEN)!=0){
  prints("密码输进毛病,请重新输进密码.\n");
  continue;
  }
  passbuf[8]='\0';
  break;
  }

这样通过限制用户使用不安全的密码,可以极大地进步系统的安全性。

唐山网站建设www.fw8.net


TAG:用户,口令,文件,函数,字典
评论加载中...
内容:
评论者: 验证码: