前兩天在部落格裡看到有位老兄用jsp寫了個測試密碼強度的指令碼,但是我覺得沒必要像他指令碼裡寫得那麼麻
煩,在加上我一時手癢(這個也許是主要原因:p),所以就禁不住用c也寫了個測試密碼強度的程式。
在開始講我的方法之前,先看看幾個弱密碼。第乙個:123456,這個恐怕是最白痴的密碼了,呵呵。第二
個:19830321,很明顯這是用生日來做密碼。第三個:abcdefgh ,不多說了,也是個弱密碼。第四個:
johnabruzz(《越獄》裡面那個黑幫老大的名字),這是用人名來做密碼。原則上這樣的密碼本身的強度其實
並不弱,但是對於跟你關係很親近的人,那就不一定了。
不知大家看出些什麼規律來沒有,我就不賣官子了。前三個密碼中,每個字元與其前後兩個字元是相臨的
。而這正好是破解軟體和破解者最喜歡的,簡單啊,估計現在沒人用這樣的密碼了。但是這卻給了我乙個提示
,在雜湊演算法中有乙個計算雜湊位址的方法,它使雜湊空間中的記錄能夠平均分布,從而降低雜湊衝突的概率
。如果我們用這種方法,把密碼中每個字元的ascii碼值一次存放到乙個陣列裡,然後計算相臨元素的差值(
第乙個元素和最後乙個元素做差)的絕對值。第乙個元素和最後乙個元素的差值用密碼的長度減1來使其平均化
,因為如果第乙個元素和最後乙個元素的差值過大,就會影響估計結果。最後,將這些差值求和並求平均值。
求完平均值後,還沒完,我們得看看密碼長度。如果密碼的長度小於6,那麼該密碼就是個弱密碼,不管它
的平均值有多大。因為密碼長度小於等於6的話,計算機可嘗試的密碼組合就是ascii碼的字元個數(標準的是
128個)的6次冪約4398億個組合。別看4398億這個數字對於你來說很大,但是現在的機器,執行速度那都是鋼
鋼的(包括賽揚),如果破解程式再用上優化演算法,最多幾分鐘就給你破解出來。後果我就不說了。
好了讓我們用上面的方法來試試,假設弱密碼的均值範圍是[0,5],中等強度密碼的均值範圍是(5,10]
,強密碼的均值範圍是(10,+∞]。我們先看第乙個弱密碼:123456,他們的ascii是相臨的,於是他們的差值
的平均值/強度值就是1,非常地弱。第二個密碼:19830321,它的強度值是3,也很弱,可見用生日做密碼一點
也不好。第三個密碼:abcdefgh,和第乙個密碼一樣,強度值是1,啥也不說了,唉。那麼我們換個強壯一點的
密碼試試,就試試我的英文名字john adams吧,它的強度值是7,看來用人名做密碼也不是多好。那麼用這個
**的密碼 fhgbd^*jk*( 試試,強度值是23,不愧是**密碼,嘿嘿。
當然這樣的方法還並不完美,因為它不會判斷密碼是不是生日、人名等資訊。我們可以用正規表示式先對
密碼進行一下判斷然後再做進一步的計算。還有就是沒有提供unicode字元的支援,但是我想這應該不難改進,
就算是留了個小作業吧:p。總之,看似複雜的問題,其實可以簡單化的,呵呵。
最後,附上我用vc寫得測試**,是個控制台程式,因為本人還不是太會做gui介面的程式,呵呵。因為本
人比較懶惰,就限制了一下密碼的長度為20位。**如下:
#include
#include
#include
#include
int getrobustnessvalue(const
char* s)
robustness += abs(((short)s[len] - (short)s[0])/(len -1));
return robustness/len;
}void main(int argc, char *argv)
if(len < 7) //if the length is less of 6, then the
strongth = getrobustnessvalue(c); //get password strongth value
//note: the array c passed to
// function getrobustnessvalue
// will degradated to a pointer
printf("/n");
printf("the password robustness is:%d/n", robustness);
if((0 <= robustness) &&(robustness <= 5))
printf("very weak password!");
if((5 < robustness) && (robustness <= 10))
printf("the robustness is still need to be improved!");
if(robustness >10)
printf("it's a robust enough password");
}while(strcmp(c, "exit")); //if the user type in "exit", then
//terminate the tester
//end of while }
了。:p
在此,再附上自己對這個演算法的時間複雜性分析(大牛請略過:p)。設密碼字串的長度為n,則取第i個字元和第i+1個字元,計算字元ascii碼差值並轉換為絕對值,將差值累加三個操作各需要o(1)的時間,而這樣
的操作需要進行n次(因為最後還要計算字串最後乙個字元跟第乙個字元的差值),所以總共耗費的時間為
n*4*o(1) = o(n),可見為線性時間。當然,當時程式中沒有考慮陣列c越界的問題,確實是乙個bug。不過,明
天我會將圖形介面的程式寫出來,算是這個程式的公升級版吧。
2008-1-14 0:05
測試密碼的強度
在某些 註冊時常常會要求設定密碼,也會根據輸入密碼的字元特點給出相應的提示,如密碼過短 強度差 強度中等 強度強等。這又是怎麼實現的呢?看下面 type password name pass id pass id passstrength span 全選 複製放進筆記 下面的正規表示式建議各位收藏哦...
密碼的強度
密碼是賬戶的重要安全保障,涉及到安全問題,太簡單的密碼容易被猜到或破解。請用程式實現 用函式實現乙個校驗密碼強度的函式,用於提醒使用者在註冊時,密碼是否足夠安全。以下為密碼強度校驗規則 密碼長度在 6 位及以上,強度 1,在 8 位及以上,強度 2,12 位及以上,強度 4 有大寫字母,強度 2 除...
Python密碼的強度
密碼是賬戶的重要安全保障,涉及到安全問題,太簡單的密碼容易被猜到或破解。請用程式實現 用函式實現乙個校驗密碼強度的函式,用於提醒使用者在註冊時,密碼是否足夠安全。以下為密碼強度校驗規則 密碼長度在 6 位及以上,強度 1,在 8 位及以上,強度 2,12 位及以上,強度 4 有大寫字母,強度 2 除...