吳艷婷 方賢進(jìn)
摘要:操作系統(tǒng)以及各種應(yīng)用系統(tǒng)中的賬戶口令(password)是不能以明文形式存放在數(shù)據(jù)中的,這是因?yàn)閿?shù)據(jù)庫(kù)安全一旦出現(xiàn)問(wèn)題,口令泄露會(huì)造成很大的損失。操作系統(tǒng)及各種應(yīng)用系統(tǒng)的賬戶口令都是加密的。該文詳細(xì)地論述Linux系統(tǒng)中用戶口令的加密機(jī)制及相關(guān)知識(shí),通過(guò)實(shí)例研究了利用函數(shù)crypt( )的加密機(jī)制及其應(yīng)用。
關(guān)鍵詞:操作系統(tǒng);賬戶口令;Linux系統(tǒng)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)35-0048-02
1 口令的保護(hù)機(jī)制
無(wú)論是操作系統(tǒng)的用戶帳號(hào)還是各種應(yīng)用系統(tǒng)的用戶帳號(hào)都是以加密后保存或求其hash值之后保存的,否則數(shù)據(jù)庫(kù)的泄漏會(huì)導(dǎo)致嚴(yán)重的問(wèn)題。例如CSDN網(wǎng)站因?yàn)橐粋€(gè)漏洞整站數(shù)據(jù)庫(kù)被拖下來(lái),用戶帳戶名和口令全部暴露。這帶來(lái)一個(gè)更嚴(yán)重問(wèn)題,很多人在不同的站點(diǎn)上使用的都是同一個(gè)用戶名和口令,別人拿著這個(gè)被暴露出來(lái)的口令到其他各大網(wǎng)站(如淘寶、支付寶、網(wǎng)銀等)試一下,用戶的損失將非常嚴(yán)重。
1.1 求用戶口令的Hash值
Hash值是對(duì)消息(Message)求其單向映射函數(shù)得到消息摘要,比較流行的hash函數(shù)有MD5[1],SHA1[2],SHA256, SHA512, RipeMD等。例如對(duì)消息m=“anhui university of science and technology“,求其MD5和SHA1的消息摘要分別為128bits和160bits的hash值(以16進(jìn)制表示):
MD5(m)=67198f358ed8cf0db2cce1ccab8005dc
SHA1(m)=747ec011da942f5bc72a8493cd3d51f5d09bc245
若對(duì)用戶設(shè)置的口令用其hash值后再放到數(shù)據(jù)庫(kù)中保存,然后每次用戶登錄時(shí)先對(duì)用戶輸入的口令計(jì)算其hash值,再與數(shù)據(jù)庫(kù)中保存的hash值比較進(jìn)行用戶登錄身份的驗(yàn)證,這樣即使數(shù)據(jù)庫(kù)泄露,別人也無(wú)法通過(guò)那個(gè)hash值得到用戶的真實(shí)口令。
1.2 salt的使用
在一定程度上別人得到 hash值之后,的確幾乎不可能逆向算出原始口令。但用戶的口令設(shè)置通常比較簡(jiǎn)單、容易構(gòu)造,只要盡可能多地列舉常見(jiàn)密碼然后求其hash值得到對(duì)應(yīng)關(guān)系表(被稱為彩虹表,Rainbow Table)[3],就比較容易得到原始口令,因?yàn)楝F(xiàn)在黑客們已經(jīng)構(gòu)造出TB量級(jí)的彩虹表。因此,采用加鹽(salt)的方法來(lái)加大口令被猜解的難度。具體來(lái)說(shuō)就是在用戶設(shè)置口令后,再隨機(jī)生成一個(gè)字符串(即salt),把口令和salt用某種方式組合起來(lái)(即加salt)然后再計(jì)算hash值后放入數(shù)據(jù)庫(kù)中,同時(shí)把隨機(jī)生成的salt也放入數(shù)據(jù)庫(kù)中。用戶登錄時(shí),從數(shù)據(jù)庫(kù)中取出對(duì)應(yīng)的salt,再和用戶輸入的口令組合一下求 hash值,與數(shù)據(jù)庫(kù)中的 hash 值比對(duì)進(jìn)行用戶登錄身份認(rèn)證。
Salt的使用還能在一定程度上避免在用戶輸入的口令一樣的情況下,得到同樣的hash值。
2 Linux系統(tǒng)中用戶口令的加密機(jī)制
Crypt( )是Unix/Linux操作系統(tǒng)中的口令加密函數(shù),它是基于DES加密的[4]。 Crypt()是單向加密的,因此它只適用于口令加密存儲(chǔ)與驗(yàn)證,不適合文件資料加密。該函數(shù)的調(diào)用格式為:
char *crypt(const char *key, const char *salt);
函數(shù)調(diào)用參數(shù)中的key是用戶口令,但只使用key中每個(gè)字節(jié)的低七位,如果口令長(zhǎng)度超過(guò)8字節(jié),則只有前8個(gè)字節(jié)有效。用此方法得到56bits的DES加密密鑰,用來(lái)加密一個(gè)通常是由0組成的常量字符串。得到的加密結(jié)果是由13個(gè)字節(jié)組成的可顯示的ASCII字符,其中包含開(kāi)頭的2個(gè)salt字符。該函數(shù)中的salt使用兩個(gè)字節(jié),每個(gè)字節(jié)可從[a-z A-Z 0-9 ./]共64個(gè)字符中選擇,因此同樣的口令增加了4096種可能性(64*64)。
對(duì)于Linux系統(tǒng)中crypt( )函數(shù)的加密機(jī)制,我們可以與Linux操作系統(tǒng)所采用的口令加密機(jī)制進(jìn)行比較,看加密結(jié)果是否相同,如果不相同則Linux系統(tǒng)不是使用了簡(jiǎn)單的crypt( )函數(shù),可能加了crypt 插件或使用了不同的加密函數(shù),例如使用了shadow、pam機(jī)制等。此種狀況下加密結(jié)果是不同于cryptword.c程序的。例如圖1中的Linux系統(tǒng)用戶口令的加密結(jié)果為34個(gè)字節(jié),而程序cryptword.c的口令加密結(jié)果為13個(gè)字節(jié)。
另外也可以將程序cryptword.c與Apache軟件所附帶的htpasswd程序進(jìn)行口令加密結(jié)果比較。先用htpasswd建立口令文件passfile,同時(shí)建立用戶tom,口令設(shè)置為19450815。
其中的命令行參數(shù)中輸入的”k/”是htpasswd程序進(jìn)行口令加密時(shí)所使用的salt。此驗(yàn)證說(shuō)明Apache軟件附帶的htpasswd程序的加密方法也是使用crypt( )函數(shù)加密的。
4 總結(jié)
在Linux系統(tǒng)中crypt( )函數(shù)所使用的口令加密機(jī)制中,由于只使用了用戶的口令56bits作為DES加密算法的密鑰,密鑰空間的大小=256≈7.2*1016,如果用并行計(jì)算機(jī)對(duì)用戶口令的所有值進(jìn)行強(qiáng)力搜索的話,其安全性得不到保障。因此在設(shè)置口令時(shí)應(yīng)盡量避免使用常見(jiàn)的單詞和姓名,即禁止弱口令的使用。另外,Linux系統(tǒng)為了保護(hù)加密后的口令,對(duì)文件/etc/shadow采用了訪問(wèn)控制機(jī)制,該文件只有root賬戶有訪問(wèn)權(quán),并且該文件屬性為400。
參考文獻(xiàn):
[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] 谷利澤,鄭世慧,楊義先. 現(xiàn)代密碼學(xué)教程[M]. 2版. 北京:北京郵電大學(xué)出版社, 2015.