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

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

Unix的口令文件passwd是一个加密后的文本文件,储存在/etc目录下。该文件用于用户登录时校验用户的口令,仅对root权限可写。口令文件中每行代表一个用户条目,格式为:LOGNAME : PASSWORD : UID : GID : USERINFO : HOME : SHELL。每行的头两项是登录名和加密后的口令,UID和GID是用户的ID号和用户所在组的ID号,USERINFO是系统管理员写入的有关该用户的信息,HOME是一个路径名,是分配给用户的主目录,SHELL是用户登录后将执行的shell(若为空格则缺省为/bin/sh)。目前多数Unix系统中,口令文件都做了Shadow变换,即把/etc/passwd文件中的口令域分离出来,单独存在/etc/shadow文件中,并加强对shadow的保护,以增强口令安全。
Unix系统使用一个单向函数crypt()来加密用户的口令。Crypt()是基于DES的加密算法,它将用户输入的口令作为密钥,加密一个64bit的0/1串,加密的结果又使用用户的口令再次加密;重复该过程,一共进行25次。最后的输出为一个13byte的字符串,存放在/etc/passwd的PASSWORD域。单向函数crypt()从数学原理上保证了从加密的密文得到加密前的明文是不可能的或是非常困难的。当用户登录时,系统并不是去解密已加密的口令,而是将输入的口令明文字符串传给加密函数,将加密函数的输出与/etc/passwd文件中该用户条目的PASSWORD域进行比较,若匹配成功,则允许用户登录系统。

口令破解原理

口令破解通常有蛮力攻击和字典攻击两种方式。Unix中一共有 [0x00~0xff] 共128个字符,其中 95个字符(10(数字)+33(标点符号)+26*2(大小写字母) )可作为口令的字符。假设m为可能使用的字符集的大小,n为口令的长度,则可生成的口令数为m的n次幂,随着字符集的扩大与口令长度的增加,口令攻击尝试次数将迅速增加。 如口令长度为6,取字母和数字组合,可能性是62 的6次幂56,800,235,584。但如果5个字母是一个常用汉字的拼音或英文单词,估算一下常用词约为10000条, 从10000个常用词中取一个词与任意一个数字字符组合成口令,则仅10000* 10 = 100000 (10万种可能)。在口令的设置过程中,还有许多个人因素在起作用,为使自己的口令容易记忆,许多人往往将个人的姓名、生日、电话号码、街道的号码等作为口令,这样便为口令的破解留下了方便之门。

贝尔实验室的计算机安全专家R.Morris和K.Thompson提出了这样一种攻击的可能性:可以根据用户的信息建立一个他可能使用的口令的字典。比如:他父亲的名字、女朋友的生日或名字,街道的名字等等。然后对这个字典进行加密,每次拿出一个经过加密计算的条目与口令文件比较,若一致,口令就被猜到了。
也许有人认为口令毫无规律可言,字典中不会有,计算机是破译不了的,那就大错特错了。有很多专门生成字典的程序,比如:Dictmake、txt2dict、xkey等等。以dictmake为例:启动程序后,计算机会要求输入最小口令长度、最大口令长度、口令包含的小写字符、大写字符、数字、有没有空格、含不含标点符号和特殊字符等一系列的问题。当回答完了计算机提出的问题后,计算机就会按照给定的条件自动将所有的组合方式列出来并存到文件中,而这个文件就是资料字典。目前,在因特网上,有一些数据字典可以下载,包含的条目从1万到几十万条。数据字典一般囊括了常用的单词。攻击者一旦通过某种途径获得了passwd文件,破译过程便只需一个简单的C程序即可完成。

Unix中有一组子程序可对/etc/passwd文件进行方便的存取。getpwuid()函数可从/etc/passwd文件中获取指定的UID的入口项。getpwnam()函数可在/etc/passwd文件中获取指定的登录名入口项。这两个子程序返回一指向passwd结构的指针,该结构定义在
/usr/include/pwd.h中,定义如下:
struct passwd {
char * pw_name; /* 登录名 */
char * pw_passwd; /* 加密后的口令 */
uid_t pw_uid; /* UID */
gid_t pw_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文件并返回指向文件中第一个用户条目的指针,再次调用getpwent()便可顺序地返回口令文件中的各用户条目,setpwent() 可把口令文件的指针重新置为文件的开始处,endpwent() 可关闭口令文件。
由此可见,攻击者只需建立一个字典文件,然后调用现成的cryp()加密例程来加密字典文件中的每一条目,再用上述函数打开口令文件,进行循环比较就很容易破解密码了。
实际上Internet网上有很多现成的密码破解软件工具,过于简单的口令很容易破解。那么,我们用什么方法来保证用户口令是一个安全的口令呢?运用CrackLib来构建安全的Unix口令是一个较好的办法。

CrackLib原理及应用

CrackLib是一个用于UNIX系统下的函数库, 它可以用于编写和口令有关的程序。 其基本思想就是通过限制用户使用使用过于简单、容易被猜测出来或容易被一些工具搜索到的密码,来提高系统的安全性。 
CrackLib并不是一个可以直接运行使用的程序, 它只是一个函数库, 可以利用其中的函数写自己的程序或是加入其它程序中以提高安全性,如可以改写passwd 使用户在选择密码时受到限制。CrackLib使用一个字典, 它查找字典以判断用户所选密码是不是安全的密码。用户也可以加入其它信息, 使用自己的字典。CrackLib通过建立索引和二元查找,效率非常高,其字典大小通常只有同等字典数的一半。下面介绍如何运用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.hwm三个文件。
CrackLib 字典可直接从网上下载,也可以用它提供的工具生成。如果想加入其它信息, 使用自己的字典,可将含有新词的文件放到SOURCEDICT目录如"/usr/dict/words"下,CrackLib会将所有文件合并起来,删除多余的词,将其压缩成字典文件,通常只有原文件
40%-60%的大小。
2、在程序中调用函数
CrackLib函数可以被应用于很多地方, 只需加入简单的几行源码, 就可以得到非常好的效果。 char *FascistCheck(char *pw, char *dictpath) 是CrackLib中最常用的函数。其中 pw是用户选择的密码, 将被验证是不是安全的,dictpath是字典所在路径。
FascistCheck() 返回一个空指针,说明口令很安全,否则返回诊断出的字符串。下面是一个口令设置的简单示例, 用以说明CrackLib函数用法.

#ifndef CRACKLIB_DICTPATH
#define CRACKLIB_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("请再输入一次你的密码 );
if( strncmp( passbuf, newuser.passwd, PASSLEN ) != 0 ) {
prints("密码输入错误, 请重新输入密码./n" ;
continue;
}
passbuf[8] = ‘/0’ ;
break;
}
这样通过限制用户使用不安全的密码, 可以极大地提高系统的安全性

欢迎访问:乐园www.ly8.co

加密 UNIX 口令相关推荐

  1. form标签的action之前 加密_口令爆破之突破前端JS加密

    0x00 前言 近期安全测试时发现一个系统前台使用了SSO,但是在比较隐蔽API中发现了后台的登录接口,该接口未使用SSO,同时没有图形验证码等校验,通过分析最终爆破进入后台. 0x01 确认攻击途径 ...

  2. 我的“月账单系统”(ord(char)动态加密系统口令)

    我的CSDN主页 My Python 学习个人备忘录 我的博文推荐 我的"月账单系统" 主菜单 添加新账 bug修复 (2012-12-27补增) 账单浏览 月底扎账 账单导出 口 ...

  3. Unix/BSD/Linux的口令机制初探(转)

    Unix/BSD/Linux的口令机制初探(转) Freebird 1.概述 早期U N I X系统把用户口令保存在一个纯文本可读的"口令文件"中,这可能在系统管理员注意不到的情况 ...

  4. Unix BSD Linux的口令机制初探

    1.概述 早期UNIX系统把用户口令保存在一个纯文本可读的"口令文件"中,这可能在系统管理员注意不到的情况下被截取并暴露.它也可能在一次偶然事件中泄露. 从AT&T UNI ...

  5. oracle缺省口令,更改口令加密的缺省算法(任务)

    更改口令加密的缺省算法(任务) 缺省情况下,使用 crypt_sha256 算法对用户口令进行加密.可以通过更改缺省口令加密算法来使用不同的加密算法. 如何指定口令加密的算法 在此过程中,BSD-Li ...

  6. 使用 ASP.NET 加密口令

    作者:未知   请作者速与本人联系 当我们在网站上建立数据库时,保护用户的信息安全是非常必要的.多数用户不愿意让别人知道自己的信息,同时网管也不想因为安全问题而丢失网站的信誉.无论对于谁,安全问题都是 ...

  7. java 手机动态口令_动态密码TOTP的Java实现

    一.HOTP HOTP 算法,全称是"An HMAC-Based One-Time Password Algorithm",是一种基于事件计数的一次性密码生成算法,详细的算法介绍可 ...

  8. 【网络与系统安全实验】口令破解及防御

    [网络与系统安全实验]口令破解及防御 口令的历史与现状 20世纪80年代,当计算机开始在公司里广泛应用时,人们很快就意识到需要保护计算机中的信息.仅用userID标识自己,很容易被其他人得到,出于这个 ...

  9. Unix高级安全设置

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 文章阅读 The ...

最新文章

  1. 2018年人工智能将赋能所有行业,未来市场将超过400亿美元
  2. 简明python教程百度云-网易云课堂 - 我的职业课堂
  3. stm8s003 8K空间不够用,出现报错,修改stvd参数进行最优化
  4. bool类型头文件_[C++基础入门] 2、数据类型
  5. python3进阶_Python3 进阶教程 2020全新版
  6. [LeetCode] #22 Generate Parentheses
  7. OpenCV3学习(12.5) opencv实现粒子滤波目标跟踪
  8. goto php 源码,GoToPHP
  9. springMVC 格式转换
  10. java 多环境 虚拟环境_Spring profile通过多种方法实现多环境支持
  11. mac apache 启动php,Mac OS上搭建Apache+PHP+MySQL开发环境的详细教程
  12. XML文件源码察看器(三)
  13. 关于Spring Cloud Eureka
  14. 修复Kindle,解决:误把kindle做了启动U盘后windows无法读kindle内容问题
  15. kali linux安装vmware tools过程详解
  16. Rocky Linux Yum源替换位上海交大镜像站点
  17. mysql停止修复_浅析MySQL 8.0崩溃恢复
  18. 美女主管送我这个撸码神器!爽翻了......
  19. 解决C#界面假死问题
  20. 1123_AURIX_TC275_DAP接口学习

热门文章

  1. 【一级讲解】虚数的纸牌(欢乐斗地主)——桶排序解决错位连续问题
  2. 铭瑄主板u盘启动装系统
  3. 郭盛华:警惕家庭智能扬声器中潜在的窃听风险
  4. Xilinx FPGA所有系列封装文件查看下载,可以查看IO类型及对应的bank
  5. 微商快速查找日加上万精准粉丝群
  6. 实战:Thinkphp+MySQL电影点播系统02-验证器与自定义异常
  7. go操作excel方便么_Golang读写Excel的方法教程
  8. ue5,ue4(虚幻5)安卓触摸
  9. 对LOWORD, HIWORD, LOBYTE, HIBYTE的理解
  10. 【论文阅读】基于视图的图卷积神经网络3D物体形状识别算法