淺析加密算法在Web安全登錄認(rèn)證中的應(yīng)用
對于Web應(yīng)用程序,安全登錄是很重要的。但是目前大多數(shù) Web 系統(tǒng)在發(fā)送登錄密碼時是發(fā)送的明文,很容易被入侵者監(jiān)聽到密碼。如果在登錄系統(tǒng)中加入安全登錄機(jī)制,則可以在Web 服務(wù)器上實現(xiàn)安全登錄。
要實現(xiàn)安全登錄,可以采用下面三種方法,一種基于非對稱加密算法,一種基于對稱加密算法,最后一種基于散列算法。
非對稱加密算法中,目前最常用的是 RSA 算法和 ECC算法。要采用非對稱加密算法實現(xiàn)安全登錄的話,首先需要在客戶端向服務(wù)器端請求登錄頁面時,服務(wù)器生成公鑰和私鑰,然后將公鑰隨登錄頁面一起傳遞給客戶端瀏覽器,當(dāng)用戶輸入完用戶名密碼點擊登錄時,登錄頁面中的 JavaScript 調(diào)用非對稱加密算法對用戶名和密碼用用公鑰進(jìn)行加密。然后再提交到服務(wù)器端,服務(wù)器端利用私鑰進(jìn)行解密,再跟數(shù)據(jù)庫中的用戶名密碼進(jìn)行比較,如果一致,則登錄成功,否則登錄失敗。
看上去很簡單,但是,目前 RSA 算法中,1024-2048 位的密鑰被認(rèn)為是安全的。如果密鑰長度小于這個長度,則認(rèn)為可以被破解。但這樣的長度超過了程序設(shè)計語言本身所允許的數(shù)字運算范圍,需要通過模擬來實現(xiàn)大數(shù)運算。而在 Web 系統(tǒng)的客戶端,如果通過 JavaScript 來模擬大數(shù)運行的話,效率將會是很低的,因此要在客戶端采用這樣的密鑰來加密數(shù)據(jù)的話,許多瀏覽器會發(fā)出執(zhí)行時間過長,停止運行的警告。ECC 算法的密鑰長度要求比 RSA 算法要低一些,ECC 算法中 160 位的密鑰長度被認(rèn)為與 RSA 算法中 1024 位的密鑰長度的安全性是等價的。雖然要涉及的模擬大數(shù)運算,但 ECC 算法的密鑰長度的運算量還算是可以接受的,但是 ECC 算法比 RSA 算法要復(fù)雜的多,因此實現(xiàn)起來也很困難。

對稱加密算法比非對稱加密算法要快得多,但是對稱加密算法需要數(shù)據(jù)發(fā)送方和接受方共用一個密鑰,密鑰是不能通過不安全的網(wǎng)絡(luò)直接傳遞的,否則密鑰和加密以后的數(shù)據(jù)如果同時監(jiān)聽到的話,入侵者就可以直接利用監(jiān)聽到的密鑰來對加密后的信息進(jìn)行解密了。
如果我們采用散列算法對登錄密碼進(jìn)行處理的話,可以避免被直接解密出原文,但是如果直接采用 MD5 或者 SHA1 來對登錄密碼進(jìn)行處理后提交的話,一旦入侵者監(jiān)聽到散列后的密碼,則不需要解密出原文,直接將監(jiān)聽到的數(shù)據(jù)提交給服務(wù)器,就可以實現(xiàn)入侵的目的了。而且,目前 MD5 算法已被破解,SHA1 算法則被證明從理論上可破解,就算采用離線碰撞,也可以找出與原密碼等價的密碼來。所以直接采用 MD5 或者 SHA1 來對密碼進(jìn)行散列處理也是不可行的。
但是如果在散列算法中加入了密鑰呢?。hmac 算法正好作了這樣的事情,我們來看看如何用 hmac 算法實現(xiàn)安全登錄。首先在客戶端向服務(wù)器端請求登錄頁面時,服務(wù)器端生成一個隨機(jī)字符串,連同登錄頁面一同發(fā)送給客戶端瀏覽器,當(dāng)用戶輸入完用戶名密碼后,將密碼采用 MD5 或者 SHA1 來生成散列值作為密鑰,服務(wù)器端發(fā)送來的隨機(jī)字符串作為消息數(shù)據(jù),進(jìn)行 hmac 運算。然后將結(jié)果提交給服務(wù)器。服務(wù)器端接收到客戶端提交的數(shù)據(jù)后,將保存在服務(wù)器端的隨機(jī)字符串和用戶密碼進(jìn)行相同的運算,然后進(jìn)行比較,如果結(jié)果一致,則認(rèn)為登錄成功,否則登錄失敗。
客戶端每次請求時服務(wù)器端發(fā)送的隨機(jī)字符串都是不同的,因此即使入侵者監(jiān)聽到了這個隨機(jī)字符串和加密后的提交的數(shù)據(jù),它也無法再次提交相同的數(shù)據(jù)通過驗證。而且通過監(jiān)聽到的數(shù)據(jù)也無法計算出密鑰,所以也就無法偽造登錄信息了。









