歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> BSD

Unix/BSD/Linux的口令機制初探


1.概述
早期U N I X系統把用戶口令保存在一個純文本可讀的“口令文件”中,這可能在系統管理員注意不到的情況下被截取並暴露。它也可能在一次偶然事件中洩露。
從AT&T UNIX版本6開始,Thompson 等決定采用一個不同的方式: U N I X口令采用以美國軍方M - 2 0 9密碼機為模型的基於旋轉的算法來進行編碼。這種快速算法被證明對窮盡純文本搜索有弱點並被AT&T UNIX版本7中出現的更先進的crypt ( )庫代替。
現在Unix/Linux將口令以不可讀的方式保存在機器中。系統使用名為cryptographic hash的算法將口令轉換成文本字符串。這個串即稱為散列或者散列值。使用的算法可以有多種,但它們都是不可逆的,也就是說不能從散列值中恢復出原始口令。不同的系統,所使用的密碼文件以及加密算法都可能不同。管理、維護好這些密碼文件是保證系統安全的首要任務。(未特別說明,本文所有命令均在csh下以root身份運行。)
2.加密算法簡介
2.1---crypt()簡介---key 和 salt
在Unix/Linux下存在多種散列算法。可以通過庫函數crypt()調用這些系統支持的算法。crypt()有key和salt兩個參數,並返回相應的散列值。salt亦即我們常說的“鹽”,它只是簡單的字符串,它的長度取決於所使用的算法,不同的散列算法它有不同的取值范圍。所以,即使是相同的算法,相同的原始口令,使用不同的salt,也會得到不同的加密口令。salt的目的也就是為了加大口令破解的難度,當我們使用passwd命令來修改密碼時,它會隨機選擇一個salt. s a l t使得使用預編譯字典對加密口令進行攻擊變得更困難。代替為字典中每個單詞做一次單獨加密,攻擊者現在不得不對字典中每個單詞的4 0 9 6種排列進行加密和儲存。在2 0年前,s a l t是作為本質上的資源障礙引入的,但現在1 2位s a l t不再被認為是一種有效的防御方法。
crypt()可以在C程序中直接調用,甚至可以用perl直接調用,(詳細信息請man 3 crypt),如下例:
%perl -e 'print crypt("mypass","s1"),"\n"'
s1tROevFyi.yQ
%perl -e 'print crypt("mypass","s2"),"\n"'
s2JQ85JElCMeU
以上兩例中s1、s2分別為salt 值,可以看到,相同的口令(上例中為mypass)使用不同的salt將得到不同的散列值。 以上兩例使用的都是DES算法,加密後的散列值將salt值作為其前綴。
2.2DES算法
由美國政府和IBM研制。所有的Linux版本和幾乎所有的Unix系統都支持DES.DES實際上為一個加密算法,但是crypt(3)將之做為散列算法。普通的DES算法容許的原始口令長度為8個字符,多余的口令也接受,但是多余部分會被系統自動摒棄。但有些系統(例如HP-UX)使用DES的多次迭代來解決此問題,這樣就可以使用任意長度的密碼。但是使用DES加密後的口令為13個字符長。
2.3MD5算法
它是真正的散列算法。允許無限長的口令。它使用的salt空間也別DES算法大得多,所以兩口令相同的可能性更小。它也通過調用crypt(3)函數實現。MD5算法使用的 salt必須以$1$開頭,並以$結尾。且salt長度為8個字符。例如要用abcdef為salt 散列mypass,那麼如下:
%perl -e 'print crypt("mypass","\$1\$abcdef\$"),"\n"'
$1$abcdef$nRHvewzGzJoYskdQAIEQr
注:上例中的"\n"均為轉義字符。salt值為$1$abcdef$,原始密碼為mypass,散列值為:$1$abcdef$nRHvewzGzJoYskdQAIEQr
MD5算法得到的散列值為31個字符長,並且都以$1$開頭。
2.4其他算法:
BSDI風格的DES和Blowfish使用也比較廣泛,本文將在後面會有討論。
2.5 BSD使用的加密機制:
各種D E S很長一段時間內一直是U N I X口令加密的主要算法,但還有其他算法可以代替D E S。現代B S D系統提供了一些其他算法的應用范例。缺省情況下, FreeBSD默認使用MD5加密機制,因為MD5沒有出口限制,同時也更安全於DES。DES仍然可用,只不過DES存在的目的僅僅是為了和其他 UNIX系統所用的密碼的向後兼容性。並且使用DES的系統也能鑒別出MD5,因為MD5所用的Hash也在DES中被使用。
O p e n B S D走得更遠。其開發小組在加拿大,這樣就不受美國的出口限制。O p e n B S D可以被配置成使用傳統的UNIX crypt () 、比如“擴充加密”、M D 5或B l o w f i s h。M D 5由Ronald L.Rivest開發,它在RFC 1321中描述。F r e e B S D和O p e n B S D中基於M D 5的crypt ( ) 產生的口令條目包含版本號、s a l t和哈希口令,彼此之間用“ $”符號分隔。一個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年開發,是D E S的一個快速、壓縮、簡單且免費的替代品]。雖然S c h n e i e r指出B l o w f i s h不適合產生單向哈希,但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的十六進制數字組成的固定字符串進行初始化的。初始化的B l o w f i s h狀態由s a l t和口令進行擴展,該過程重復一定的次數(該數值也被編入口令串中)。最後的B l o w f i s h口令條目是使用B l o w f i s h狀態對字符串“ 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版本號、算法重復次數以及s a l t和哈希口令的連結—每個之間由“ $”字符隔開。一個編碼“ 8”將聲明2 5 6次循環。一個有效的B l o w f i s h口令看起來如下:
$2a$12$eIAq8PR8sIUnJlHaohxX209x9O1m2vk97LJ5dsXdmB.eXF42qjchC
在這個例子中,初始的擴展進行4 0 9 6次。給出了很大的重復次數和長的口令, B l o w f i s h加密的口令比其他基於傳統D E S機制加密的口令更難被攻擊。給出由這些算法改進所提供的額外安全措施後,它被應用在其他U N I X系統中只是一個時間問題了。
2.6----如何得知你的系統使用的加密算法
方法可以有很多,本人簡單列舉幾個:
方法(1)你可以通過查看 libcrypt[._*]鏈接到/usr/lib下的哪些庫文件來得知你的系統密碼所使用的加密算法。如果鏈接到libcrypt*庫,那麼使用的為MD5,如果為libdescrypt*,就應該為DES了。具體操作如下:
%cd /usr/lib
%ls -l libcrypt[._]*
lrwxr-xr-x  1 root  wheel       11 Jun  9 06:18 /usr/lib/libcrypt.a@ ->
libscrypt.a
lrwxr-xr-x  1 root  wheel       13 Jun  9 06:22 /usr/lib/libcrypt_p.a@ ->
libscrypt_p.a
%
Copyright © Linux教程網 All Rights Reserved