在Unix/Linux下存在多種散列算法??梢酝ㄟ^庫函數(shù)crypt()調(diào)用這些系統(tǒng)支持的算法。crypt()有key和salt兩個參數(shù),并返回相應的散列值。salt亦即我們常說的“鹽”,它只是簡單的字符串,它的長度取決于所使用的算法,不同的散列算法它有不同的取值范圍。所以,即使是相同的算法,相同的原始口令,使用不同的salt,也會得到不同的加密口令。salt的目的也就是為了加大口令破解的難度,當我們使用passwd命令來修改密碼時,它會隨機選擇一個salt. s a l t使得使用預編譯字典對加密口令進行攻擊變得更困難。代替為字典中每個單詞做一次單獨加密,攻擊者現(xiàn)在不得不對字典中每個單詞的4 0 9 6種排列進行加密和儲存。在2 0年前,s a l t是作為本質(zhì)上的資源障礙引入的,但現(xiàn)在1 2位s a l t不再被認為是一種有效的防御方法。
各種D E S很長一段時間內(nèi)一直是U N I X口令加密的主要算法,但還有其他算法可以代替D E S。現(xiàn)代B S D系統(tǒng)提供了一些其他算法的應用范例。缺省情況下, FreeBSD默認使用MD5加密機制,因為MD5沒有出口限制,同時也更安全于DES。DES仍然可用,只不過DES存在的目的僅僅是為了和其他 UNIX系統(tǒng)所用的密碼的向后兼容性。并且使用DES的系統(tǒng)也能鑒別出MD5,因為MD5所用的Hash也在DES中被使用。
O p e n B S D走得更遠。其開發(fā)小組在加拿大,這樣就不受美國的出口限制。O p e n B S D可以被配置成使用傳統(tǒng)的UNIX crypt () 、比如“擴充加密”、M D 5或B l o w f i s h。M D 5由Ronald L.Rivest開發(fā),它在RFC 1321中描述。F r e e B S D和O p e n B S D中基于M D 5的crypt ( ) 產(chǎn)生的口令條目包含版本號、s a l t和哈??诹睿舜酥g用“ $”符號分隔。一個M D 5口令看起來如下:
$ 1 $ c a e i H Q w X $ h s K q O j r F R R N 6 K 3 2 O W K C B f 1
這里“$ 1”指明M D 5,“c a e i H Q w X”是s a l t。
B l o w f i s h由Bruce Schneier在1 9 9 3年開發(fā),是D E S的一個快速、壓縮、簡單且免費的替代品]。雖然S c h n e i e r指出B l o w f i s h不適合產(chǎn)生單向哈希,但O p e n B S D就為這個目的使用它。B l o w f i s h版的crypt ( )使用1 2 8位s a l t,足夠使最堅定的破壞者泄氣。用所有可能的s a l t值進行預編譯的字典將十分昂貴。其最大口令長度為7 2個字符。B l o w f i s h算法是一個由p i的十六進制數(shù)字組成的固定字符串進行初始化的。初始化的B l o w f i s h狀態(tài)由s a l t和口令進行擴展,該過程重復一定的次數(shù)(該數(shù)值也被編入口令串中)。最后的B l o w f i s h口令條目是使用B l o w f i s h狀態(tài)對字符串“ O r p h e a n B e h o l d e r S c r y D o u b t”加密6 4次而得到的。
加密的口令條目包含B l o w f i s h版本號、算法重復次數(shù)以及s a l t和哈希口令的連結(jié)—每個之間由“ $”字符隔開。一個編碼“ 8”將聲明2 5 6次循環(huán)。一個有效的B l o w f i s h口令看起來如下:
傳統(tǒng)的Unix中均使用該文件來存放用戶密碼。該文件以加密的方式保存口令,其中的口令必須通過passwd口令來生成(如果使用NIS,相應的為ypasswd),或者從另一賬號中復制過來。 P a s s w d文件中的每個條目看起來如下: n a m e : c o d e d - p a s s w d : U I D : G I D : u s e r - i n f o : h o m e - d i r e c t o r y : s h e l l 7個域中的每一個由冒號隔開。空格是不允許的,除非在u s e r- i n f o域中使用。下面總結(jié)了 每個域的含義:
①name—給用戶分配的用戶名,這不是私有信息。 ② c o d e d - p a s s w d—經(jīng)過加密的用戶口令。如果一個系統(tǒng)管理員需要阻止一個用戶登錄,則經(jīng)常用一個星號( : * :)代替。該域通常不手工編輯。用戶應該使用p a s s w d命令修改他們的口令。值得注意的一點是許多最近的U N I X 產(chǎn)品依賴“影子口令” — 不在/ e t c / p a s s w d中保存的口令。 ③ UID—用戶的唯一標識號。習慣上,小于1 0 0的U I D是為系統(tǒng)帳號保留的。 ④ G I D—用戶所屬的基本分組。通常它將決定用戶創(chuàng)建文件的分組擁有權(quán)。在Red Hat L i n u x中,每個用戶帳號被缺省賦予一個唯一分組。 ⑤ u s e r- i n f o—習慣上它包括用戶的全名。郵件系統(tǒng)和f i n g e r這樣的工具習慣使用該域中的信息。該域也被稱作G E C O S域。 ⑥ home-directory—該域指明用戶的起始目錄,它是用戶登錄進入后的初始工作目錄。 ⑦ s h e l l—該域指明用戶登錄進入后執(zhí)行的命令解釋器所在的路徑。有好幾種流行的S h e l l,包括Bourne Shell (/bin/sh),C Shell (/bin/csh),Korn Shell (/bin/ksh)和Bash Shell( / b i n / b a s h )。注意可以為用戶在該域中賦一個/ b i n / f a l s e值,這將阻止用戶登錄。
傳統(tǒng)上,/ e t c / p a s s w d文件在很大范圍內(nèi)是可讀的,因為許多程序需要用它來把U I D轉(zhuǎn)換為用戶名。例如,如果不能訪問/ e t c / p a s s w d,那么ls -l命令將顯示數(shù)字U I D而不是用戶名。不幸的是,使用口令猜測程序,具有加密口令的可讀/ e t c / p a s s w d文件表現(xiàn)出巨大的安全危險。多數(shù)近來的U N I X產(chǎn)品支持一個變通方法:影子口令文件。影子口令系統(tǒng)把口令文件分成兩部分: / e t c / p a s s w d和影子口令文件。影子口令文件保存加密的口令;/ e t c / p a s s w d中的c o d e d - p a s s w o r d域都被置為“X”或其他替代符號。影子口令文件只能被r o o t或像p a s s w d這樣的s e t _ u i d程序在需要合法訪問時讀取,其他所有非授權(quán)用戶都被拒絕訪問。習慣上,影子口令文件保存在/ e t c / s h a d o w中,盡管有些系統(tǒng)使用可選的路徑和文件名。例如B S D系統(tǒng)把加密的口令保存在/ e t c / m a s t e r. p a s s w d。
/etc/shadow剖析 / e t c / s h a d o w文件包含用戶名和加密口令以及下面一些域: (1) 上一次修改口令的日期,以從1 9 7 0年1月1日開始的天數(shù)表示。 (2) 口令在兩次修改間的最小天數(shù)??诹钤诮⒑蟊仨毟牡奶鞌?shù)。 (3)口令更改之前向用戶發(fā)出警告的天數(shù)。 (4)口令終止后帳號被禁用的天數(shù)。 (5)自從1 9 7 0年1月1日起帳號被禁用的天數(shù)。 (6)保留域。 下面是一個Red Hat Linux系統(tǒng)中/ e t c / s h a d o w文件的例子:
在可選影子口令功能的系統(tǒng)中,用一條相對簡單的命令設置并更新影子口令文件:p w c o n v。該命令在影子口令文件不存在的情況下創(chuàng)建一個新的。如果已存在一個影子文件,p w c o n v把/ e t c / p a s s w d中的新用戶添加到/ e t c / s h a d o w中,把/ e t c / p a s s w d中沒有的用戶從影子文件中刪去,并把口令從/ e t c / p a s s w d移到影子文件中。在Red Hat Linux中,p w c o n v把新的/ e t c / p a s s w d文件寫到一個名為n p a s s w d的文件中,把新影子文件寫到n s h a d o w中。這些新文件需要手工進行重命名或拷貝。用戶可以用p w u n c o n v命令返回到不使用影子文件的情況下,它把影子文件中的信息合并回傳統(tǒng)的口令文件中。
提示:早期的L i n u x不支持影子口令。 注意:在solaris下,必須使用隱蔽口令文件,在Linux下,如果用戶安裝了shadow軟件也可以使用。