淺析加密算法在Web安全登錄認(rèn)證中的應(yīng)用

對(duì)于Web應(yīng)用程序,安全登錄是很重要的。但是目前大多數(shù) Web 系統(tǒng)在發(fā)送登錄密碼時(shí)是發(fā)送的明文,很容易被入侵者監(jiān)聽(tīng)到密碼。如果在登錄系統(tǒng)中加入安全登錄機(jī)制,則可以在Web 服務(wù)器上實(shí)現(xiàn)安全登錄。

要實(shí)現(xiàn)安全登錄,可以采用下面三種方法,一種基于非對(duì)稱加密算法,一種基于對(duì)稱加密算法,最后一種基于散列算法。

非對(duì)稱加密算法中,目前最常用的是 RSA 算法和 ECC算法。要采用非對(duì)稱加密算法實(shí)現(xiàn)安全登錄的話,首先需要在客戶端向服務(wù)器端請(qǐng)求登錄頁(yè)面時(shí),服務(wù)器生成公鑰和私鑰,然后將公鑰隨登錄頁(yè)面一起傳遞給客戶端瀏覽器,當(dāng)用戶輸入完用戶名密碼點(diǎn)擊登錄時(shí),登錄頁(yè)面中的 JavaScript 調(diào)用非對(duì)稱加密算法對(duì)用戶名和密碼用用公鑰進(jìn)行加密。然后再提交到服務(wù)器端,服務(wù)器端利用私鑰進(jìn)行解密,再跟數(shù)據(jù)庫(kù)中的用戶名密碼進(jìn)行比較,如果一致,則登錄成功,否則登錄失敗。

看上去很簡(jiǎn)單,但是,目前 RSA 算法中,1024-2048 位的密鑰被認(rèn)為是安全的。如果密鑰長(zhǎng)度小于這個(gè)長(zhǎng)度,則認(rèn)為可以被破解。但這樣的長(zhǎng)度超過(guò)了程序設(shè)計(jì)語(yǔ)言本身所允許的數(shù)字運(yùn)算范圍,需要通過(guò)模擬來(lái)實(shí)現(xiàn)大數(shù)運(yùn)算。而在 Web 系統(tǒng)的客戶端,如果通過(guò) JavaScript 來(lái)模擬大數(shù)運(yùn)行的話,效率將會(huì)是很低的,因此要在客戶端采用這樣的密鑰來(lái)加密數(shù)據(jù)的話,許多瀏覽器會(huì)發(fā)出執(zhí)行時(shí)間過(guò)長(zhǎng),停止運(yùn)行的警告。ECC 算法的密鑰長(zhǎng)度要求比 RSA 算法要低一些,ECC 算法中 160 位的密鑰長(zhǎng)度被認(rèn)為與 RSA 算法中 1024 位的密鑰長(zhǎng)度的安全性是等價(jià)的。雖然要涉及的模擬大數(shù)運(yùn)算,但 ECC 算法的密鑰長(zhǎng)度的運(yùn)算量還算是可以接受的,但是 ECC 算法比 RSA 算法要復(fù)雜的多,因此實(shí)現(xiàn)起來(lái)也很困難。

淺析加密算法在Web安全登錄認(rèn)證中的應(yīng)用

對(duì)稱加密算法比非對(duì)稱加密算法要快得多,但是對(duì)稱加密算法需要數(shù)據(jù)發(fā)送方和接受方共用一個(gè)密鑰,密鑰是不能通過(guò)不安全的網(wǎng)絡(luò)直接傳遞的,否則密鑰和加密以后的數(shù)據(jù)如果同時(shí)監(jiān)聽(tīng)到的話,入侵者就可以直接利用監(jiān)聽(tīng)到的密鑰來(lái)對(duì)加密后的信息進(jìn)行解密了。

如果我們采用散列算法對(duì)登錄密碼進(jìn)行處理的話,可以避免被直接解密出原文,但是如果直接采用 MD5 或者 SHA1 來(lái)對(duì)登錄密碼進(jìn)行處理后提交的話,一旦入侵者監(jiān)聽(tīng)到散列后的密碼,則不需要解密出原文,直接將監(jiān)聽(tīng)到的數(shù)據(jù)提交給服務(wù)器,就可以實(shí)現(xiàn)入侵的目的了。而且,目前 MD5 算法已被破解,SHA1 算法則被證明從理論上可破解,就算采用離線碰撞,也可以找出與原密碼等價(jià)的密碼來(lái)。所以直接采用 MD5 或者 SHA1 來(lái)對(duì)密碼進(jìn)行散列處理也是不可行的。

但是如果在散列算法中加入了密鑰呢?。hmac 算法正好作了這樣的事情,我們來(lái)看看如何用 hmac 算法實(shí)現(xiàn)安全登錄。首先在客戶端向服務(wù)器端請(qǐng)求登錄頁(yè)面時(shí),服務(wù)器端生成一個(gè)隨機(jī)字符串,連同登錄頁(yè)面一同發(fā)送給客戶端瀏覽器,當(dāng)用戶輸入完用戶名密碼后,將密碼采用 MD5 或者 SHA1 來(lái)生成散列值作為密鑰,服務(wù)器端發(fā)送來(lái)的隨機(jī)字符串作為消息數(shù)據(jù),進(jìn)行 hmac 運(yùn)算。然后將結(jié)果提交給服務(wù)器。服務(wù)器端接收到客戶端提交的數(shù)據(jù)后,將保存在服務(wù)器端的隨機(jī)字符串和用戶密碼進(jìn)行相同的運(yùn)算,然后進(jìn)行比較,如果結(jié)果一致,則認(rèn)為登錄成功,否則登錄失敗。

客戶端每次請(qǐng)求時(shí)服務(wù)器端發(fā)送的隨機(jī)字符串都是不同的,因此即使入侵者監(jiān)聽(tīng)到了這個(gè)隨機(jī)字符串和加密后的提交的數(shù)據(jù),它也無(wú)法再次提交相同的數(shù)據(jù)通過(guò)驗(yàn)證。而且通過(guò)監(jiān)聽(tīng)到的數(shù)據(jù)也無(wú)法計(jì)算出密鑰,所以也就無(wú)法偽造登錄信息了。