Linux 系统中的口令加密函数及其应用
2016-03-07吴艳婷方贤进
吴艳婷 方贤进
摘要:操作系统以及各种应用系统中的账户口令(password)是不能以明文形式存放在数据中的,这是因为数据库安全一旦出现问题,口令泄露会造成很大的损失。操作系统及各种应用系统的账户口令都是加密的。该文详细地论述Linux系统中用户口令的加密机制及相关知识,通过实例研究了利用函数crypt( )的加密机制及其应用。
关键词:操作系统;账户口令;Linux系统
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)35-0048-02
1 口令的保护机制
无论是操作系统的用户帐号还是各种应用系统的用户帐号都是以加密后保存或求其hash值之后保存的,否则数据库的泄漏会导致严重的问题。例如CSDN网站因为一个漏洞整站数据库被拖下来,用户帐户名和口令全部暴露。这带来一个更严重问题,很多人在不同的站点上使用的都是同一个用户名和口令,别人拿着这个被暴露出来的口令到其他各大网站(如淘宝、支付宝、网银等)试一下,用户的损失将非常严重。
1.1 求用户口令的Hash值
Hash值是对消息(Message)求其单向映射函数得到消息摘要,比较流行的hash函数有MD5[1],SHA1[2],SHA256, SHA512, RipeMD等。例如对消息m=“anhui university of science and technology“,求其MD5和SHA1的消息摘要分别为128bits和160bits的hash值(以16进制表示):
MD5(m)=67198f358ed8cf0db2cce1ccab8005dc
SHA1(m)=747ec011da942f5bc72a8493cd3d51f5d09bc245
若对用户设置的口令用其hash值后再放到数据库中保存,然后每次用户登录时先对用户输入的口令计算其hash值,再与数据库中保存的hash值比较进行用户登录身份的验证,这样即使数据库泄露,别人也无法通过那个hash值得到用户的真实口令。
1.2 salt的使用
在一定程度上别人得到 hash值之后,的确几乎不可能逆向算出原始口令。但用户的口令设置通常比较简单、容易构造,只要尽可能多地列举常见密码然后求其hash值得到对应关系表(被称为彩虹表,Rainbow Table)[3],就比较容易得到原始口令,因为现在黑客们已经构造出TB量级的彩虹表。因此,采用加盐(salt)的方法来加大口令被猜解的难度。具体来说就是在用户设置口令后,再随机生成一个字符串(即salt),把口令和salt用某种方式组合起来(即加salt)然后再计算hash值后放入数据库中,同时把随机生成的salt也放入数据库中。用户登录时,从数据库中取出对应的salt,再和用户输入的口令组合一下求 hash值,与数据库中的 hash 值比对进行用户登录身份认证。
Salt的使用还能在一定程度上避免在用户输入的口令一样的情况下,得到同样的hash值。
2 Linux系统中用户口令的加密机制
Crypt( )是Unix/Linux操作系统中的口令加密函数,它是基于DES加密的[4]。 Crypt()是单向加密的,因此它只适用于口令加密存储与验证,不适合文件资料加密。该函数的调用格式为:
char *crypt(const char *key, const char *salt);
函数调用参数中的key是用户口令,但只使用key中每个字节的低七位,如果口令长度超过8字节,则只有前8个字节有效。用此方法得到56bits的DES加密密钥,用来加密一个通常是由0组成的常量字符串。得到的加密结果是由13个字节组成的可显示的ASCII字符,其中包含开头的2个salt字符。该函数中的salt使用两个字节,每个字节可从[a-z A-Z 0-9 ./]共64个字符中选择,因此同样的口令增加了4096种可能性(64*64)。
对于Linux系统中crypt( )函数的加密机制,我们可以与Linux操作系统所采用的口令加密机制进行比较,看加密结果是否相同,如果不相同则Linux系统不是使用了简单的crypt( )函数,可能加了crypt 插件或使用了不同的加密函数,例如使用了shadow、pam机制等。此种状况下加密结果是不同于cryptword.c程序的。例如图1中的Linux系统用户口令的加密结果为34个字节,而程序cryptword.c的口令加密结果为13个字节。
另外也可以将程序cryptword.c与Apache软件所附带的htpasswd程序进行口令加密结果比较。先用htpasswd建立口令文件passfile,同时建立用户tom,口令设置为19450815。
其中的命令行参数中输入的”k/”是htpasswd程序进行口令加密时所使用的salt。此验证说明Apache软件附带的htpasswd程序的加密方法也是使用crypt( )函数加密的。
4 总结
在Linux系统中crypt( )函数所使用的口令加密机制中,由于只使用了用户的口令56bits作为DES加密算法的密钥,密钥空间的大小=256≈7.2*1016,如果用并行计算机对用户口令的所有值进行强力搜索的话,其安全性得不到保障。因此在设置口令时应尽量避免使用常见的单词和姓名,即禁止弱口令的使用。另外,Linux系统为了保护加密后的口令,对文件/etc/shadow采用了访问控制机制,该文件只有root账户有访问权,并且该文件属性为400。
参考文献:
[1] MD5[EB/OL]. http://baike.baidu.com/view/2313810.htm.
[2] SHA1[EB/OL]. http://baike.baidu.com/view/1228622.htm.
[3] RainbowCrack[EB/OL]. http://project-rainbowcrack.com/table.htm.
[4] 谷利泽,郑世慧,杨义先. 现代密码学教程[M]. 2版. 北京:北京邮电大学出版社, 2015.