在Unix系統中,我們要學習的東西有很多。今天,我們就來學習下Unix函數庫中CrackLib原理及應用。CrackLib是一個用於Unix函數庫, 它可以用於編寫和口令有關的程序。其基本思想就是通過限制用戶使用使用過於簡單、容易被猜測出來或容易被一些工具搜索到的密碼,來提高系統的安全性。
CrackLib並不是一個可以直接運行使用的程序, 它只是一個Unix函數庫, 可以利用其中的函數寫自己的程序或是加入其它程序中以提高安全性,如可以改寫passwd 使用戶在選擇密碼時受到限制。
CrackLib使用一個字典, 它查找字典以判斷用戶所選密碼是不是安全的密碼。用戶也可以加入其它信息, 使用自己的字典。CrackLib通過建立索引和二元查找,效率非常高,其字典大小通常只有同等字典數的一半。下面介紹如何運用CrackLib。
1、Unix函數庫構建cracklib字典
CrackLib可以很容易的在Internet上找到, 現在使用的版本多是2.7, 首先要確定字典安裝的路徑,即給DICTPATH賦值,形式為:目錄+字典文件名(不包括後綴),如:DICTPATH=/usr/local/lib/pw_dict.。該變量值將在所有調用CrackLib函數的程序中用到,字典文件通常包括 /usr/local/lib/pw_dict.pwd,/usr/local/lib/pw_dict.pwi,/usr/local/lib/pw_dict.hwm三個文件。
CrackLib 字典可直接從網上下載,也可以用它提供的工具生成。如果想加入其它信息, 使用自己的字典,可將含有新詞的文件放到SOURCEDICT目錄如"/usr/dict/words"下,CrackLib會將所有文件合並起來,刪除多余的詞,將其壓縮成字典文件,通常只有原文件40%-60%的大小。
2、Unix函數庫在程序中調用函數
CrackLib函數可以被應用於很多地方, 只需加入簡單的幾行源碼, 就可以得到非常好的效果。 char *FascistCheck(char *pw, char *dictpath) 是CrackLib中最常用的函數。其中 pw是用戶選擇的密碼, 將被驗證是不是安全的,dictpath是字典所在路徑。
FascistCheck() 返回一個空指針,說明口令很安全,否則返回診斷出的字符串。下面是一個口令設置的簡單示例, 用以說明CrackLib函數用法.
- #ifndef CRACKLIB_DICTPATH
- #define CRACKLIB_DICTPATH "/usr/local/lib/pw_dict"
- #endif
- ...
- ...
- ...
- char *msg;
- while(1) {
- passbuf = getpass("請設定新密碼:");
- if (!*passbuf) {
- (void)printf("密碼設定取消, 繼續使用舊密碼\n");
- break;
- }
- if (strlen(pussbuf) <= 4 ││ !strcmp( passbuf, newuser.userid ) ) {
- (void)printf("密碼太短或與使用者代號相同, 請重新輸入\n ");
- continue;
- }
- if (msg = (char*) FascistCheck(passbuf, CRACKLIBPATH)) {
- printf("請另選密碼! (%s)\n",msg);
- continue;
- }
- strncpy( newuser.passwd, passbuf, PASSLEN );
- passbuf = getpass("請再輸入一次你的密碼 );
- if( strncmp( passbuf, newuser.passwd, PASSLEN ) != 0 ) {
- prints("密碼輸入錯誤, 請重新輸入密碼.\n") ;
- continue;
- }
- passbuf[8] = '\0' ;
- break;
- }
這樣通過限制用戶使用不安全的密碼, 可以極大地提高系統的安全性。Unix函數庫中的CrackLib原理及應用我們就講解到這裡了。