由於Unix安全性倍受關注。Unixd的安全性主要靠口令實現,因此,Unix口令加密算法幾度改進,現在普遍采用DES算法對口令文件進行25次加密,而對每次DES加密產生的結果,都要用2的56次方次查找與匹配才能進行一次遍歷,要破解這樣的Unix口令,其工作量是巨大的,所以從理論上說這種Unix口令是相當安全的。
然而不幸的是我們仍然不時聽道Unix口令被攻破的消息。這些Unix口令是如何被攻破的,我們又怎樣才能保證Unix口令的安全呢。下面將對這一問題進行探討。
Unix口令破解通常有蠻力攻擊和字典攻擊兩種方式。Unix中一共有 [0x00~0xff] 共128個字符,其中 95個字符(10(數字)+33(標點符號)+26*2(大小寫字母) )可作為口令的字符。假設m為可能使用的字符集的大小,n為Unix口令的長度,則可生成的口令數為m的n次冪,隨著字符集的擴大與口令長度的增加,口令攻擊嘗試次數將迅速增加。
如Unix口令長度為6,取字母和數字組合,可能性是62 的6次冪56,800,235,584。但如果5個字母是一個常用漢字的拼音或英文單詞,估算一下常用詞約為10000條,從10000個常用詞中取一個詞與任意一個數字字符組合成口令,則僅10000* 10 = 100000 (10萬種可能)。
在口令的設置過程中,還有許多個人因素在起作用,為使自己的口令容易記憶,許多人往往將個人的姓名、生日、電話號碼、街道的號碼等作為口令,這樣便為口令的破解留下了方便之門。 貝爾實驗室的計算機安全專家R.Morris和K.Thompson提出了這樣一種攻擊的可能性:可以根據用戶的信息建立一個他可能使用的口令的字典。
比如:他父親的名字、女朋友的生日或名字,街道的名字等等。然後對這個字典進行加密,每次拿出一個經過加密計算的條目與口令文件比較,若一致,口令就被猜到了。 也許有人認為Unix口令毫無規律可言,字典中不會有,計算機是破譯不了的,那就大錯特錯了。有很多專門生成字典的程序,比如:Dictmake、txt2dict、xkey等等。
以dictmake為例:啟動程序後,計算機會要求輸入最小Unix口令長度、最大口令長度、口令包含的小寫字符、大寫字符、數字、有沒有空格、含不含標點符號和特殊字符等一系列的問題。當回答完了計算機提出的問題後,計算機就會按照給定的條件自動將所有的組合方式列出來並存到文件中,而這個文件就是資料字典。
目前,在因特網上,有一些數據字典可以下載,包含的條目從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()等函數可對Unix口令文件作後續處理。首次調用getpwent()可打開/etc/passwd文件並返回指向文件中第一個用戶條目的指針,再次調用getpwent()便可順序地返回口令文件中的各用戶條目,setpwent() 可把口令文件的指針重新置為文件的開始處,endpwent() 可關閉口令文件。
由此可見,攻擊者只需建立一個字典文件,然後調用現成的cryp()加密例程來加密字典文件中的每一條目,再用上述函數打開口令文件,進行循環比較就很容易破解密碼了。
實際上Internet網上有很多現成的密碼破解軟件工具,過於簡單的口令很容易破解。那麼,我們用什麼方法來保證用戶口令是一個安全的口令呢?運用CrackLib來構建安全的Unix口令是一個較好的辦法。