馬杰 蔡妹
(海南軟件職業(yè)技術(shù)學(xué)院 海南省瓊海市 571400)
用戶驗(yàn)證是信息管理系統(tǒng)中的一個(gè)重要模塊,是保障信息安全的第一道屏障。當(dāng)前,基于用戶名和密碼的用戶驗(yàn)證依然是各類(lèi)應(yīng)用系統(tǒng)主要的用戶身份驗(yàn)證方式之一,特別是在中小型信息管理和Web 系統(tǒng)中。由于網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)拈_(kāi)放性、用戶使用弱密碼、軟件開(kāi)發(fā)者缺乏信息安全意識(shí)等原因,靜態(tài)的用戶名和密碼存在比較大的安全風(fēng)險(xiǎn),容易受到攻擊,網(wǎng)絡(luò)上用戶信息泄露的事件也層出不窮。對(duì)應(yīng)用開(kāi)發(fā)者來(lái)說(shuō),提升用戶驗(yàn)證的安全性是一項(xiàng)迫切的任務(wù)。
作為一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)訪問(wèn)接口,PDO 的運(yùn)行效率、可移植性、安全性都有了大幅度提升?;赑DO 接口,結(jié)合面向?qū)ο蠛蚆VC 開(kāi)發(fā)模式,融入通過(guò)密碼鹽和散列函數(shù)實(shí)現(xiàn)的加密算法,封裝一個(gè)具有良好安全性、復(fù)用性、可擴(kuò)展性的用戶驗(yàn)證模塊,不僅可以有效提升信息安全,還可以簡(jiǎn)化開(kāi)發(fā)難度、提高開(kāi)發(fā)效率。
如圖1 所示,User 類(lèi)作為實(shí)體類(lèi)與數(shù)據(jù)表user 進(jìn)行對(duì)應(yīng),在User 類(lèi)中實(shí)現(xiàn)對(duì)userName、userPassword 等各個(gè)成員變量的set/get訪問(wèn)器方法。UserDAO 類(lèi)基于User 類(lèi)實(shí)現(xiàn)的數(shù)據(jù)存取操作。其中,getuserID()方法用來(lái)返回一個(gè)用戶的ID,getUser()用來(lái)返回一個(gè)User 類(lèi)型的對(duì)象,getAllUsers()用戶返回所有用戶的對(duì)象鏈表。從安全性角度出發(fā),所有SQL 處理的語(yǔ)句按照prepare()和execute()的方式進(jìn)行實(shí)現(xiàn)。
Captcha 類(lèi)為在服務(wù)器端生成驗(yàn)證碼的工具類(lèi),該類(lèi)中定義一個(gè)createImg()方法,通過(guò)隨機(jī)函數(shù)在數(shù)組中選擇4 個(gè)數(shù)字或者字母作為驗(yàn)證碼,并通過(guò)PHP 圖形圖像繪制的方式返回一張圖片。這種設(shè)計(jì)讓驗(yàn)證碼在服務(wù)器端生成,可以有效防止客戶生成端驗(yàn)證帶來(lái)的安全隱患。
DataCheck 作為一個(gè)工具類(lèi)用來(lái)在服務(wù)器端對(duì)各種用戶輸入提交的數(shù)據(jù)進(jìn)行合法性驗(yàn)證,例如用戶名、密碼、表單信息等,通過(guò)在服務(wù)器端對(duì)用戶提交數(shù)據(jù)的合法性驗(yàn)證、防SQL 注入檢查,可以避免Web 前端驗(yàn)證被繞過(guò)的風(fēng)險(xiǎn),提升系統(tǒng)安全性。
PDOManager 類(lèi)作為PDO 接口的具體實(shí)現(xiàn),用來(lái)封裝數(shù)據(jù)庫(kù)連接的相關(guān)操作,考慮到數(shù)據(jù)庫(kù)訪問(wèn)的頻繁度,本文采用單例模式進(jìn)行實(shí)現(xiàn),確保數(shù)據(jù)庫(kù)連接實(shí)例具有唯一性,減少系統(tǒng)資源消耗,提升運(yùn)行效率?;趩卫J降腜DO 管理類(lèi)PDOManager 的實(shí)現(xiàn)如下:
如圖2 所示,用戶輸入用戶名、密碼、驗(yàn)證碼進(jìn)行登錄,驗(yàn)證碼圖片對(duì)象由服務(wù)器端生成并發(fā)送到到客戶端,用戶表單提交的驗(yàn)證碼首先與Session 中的驗(yàn)證碼原始值進(jìn)行對(duì)比驗(yàn)證,不通過(guò)則清除掉Session 中的驗(yàn)證碼原始值,然后重新調(diào)用Captcha 類(lèi)新生成新的驗(yàn)證碼和圖片對(duì)象。驗(yàn)證碼驗(yàn)證通過(guò)后,再調(diào)用DataCheck 工具類(lèi)對(duì)用戶名、密碼進(jìn)行合法性驗(yàn)證,然后消除字符串中可能存在的SQL 安全隱患。在完成這兩步驗(yàn)證之后,由UserDAO 對(duì)象通過(guò)單例模式的PDOManager 對(duì)象進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)操作,通過(guò)prepare()和execute()的方式執(zhí)行SQL 查詢,判斷用戶名和密碼是否正確。在判斷時(shí),密碼由用戶密碼和密碼鹽經(jīng)過(guò)散列函數(shù)運(yùn)算后生成。這樣,既保證了即使在服務(wù)器端用戶密碼也不可見(jiàn),也可以增強(qiáng)密碼安全性,減低。
密碼鹽是指在密碼的某個(gè)任意位置加入特定字符串,讓散列運(yùn)算后的結(jié)果與原始密碼直接散列運(yùn)算出的結(jié)果不同。其關(guān)鍵在于特定字符串的選擇,構(gòu)建一個(gè)隨機(jī)度高且具有唯一性的字符串作為密碼鹽,可以有效降低被針對(duì)固定散列值的彩虹表攻擊的命中率。
為了確保密碼鹽的隨機(jī)性和唯一性,設(shè)計(jì)如下算法:
(1)首先自定義一個(gè)可選擇字符串集合,然后通過(guò)str_shuffle()函數(shù)隨機(jī)打亂集合中的字符串順序。
(2)從打亂順序的字符串集合中選取一個(gè)隨機(jī)的起始位置,截取一段字符串出來(lái)作為密碼鹽前綴。隨機(jī)位置通過(guò)mt_rand()函數(shù)實(shí)現(xiàn),截取子串通過(guò)substr()函數(shù)實(shí)現(xiàn)。mt_rand()函數(shù)使用Mersenne Twister 算法作為隨機(jī)數(shù)發(fā)生器返回隨機(jī)整數(shù),它產(chǎn)生隨機(jī)數(shù)值的平均速度比作為rand()隨機(jī)數(shù)發(fā)生器的libc 快四倍。
(3)將一個(gè)固定常量字符串和時(shí)間戳進(jìn)行字符串連接,并對(duì)這個(gè)字符串通過(guò)uniqid()函數(shù)生成唯一ID。
圖1:模塊類(lèi)圖
圖2:模塊時(shí)序圖
(4)將密碼鹽前綴和ID 進(jìn)行字符串拼接,并通過(guò)散列加密函數(shù)進(jìn)行加密,此時(shí)生成的加密字符串就是密碼鹽。
(5)將密碼鹽作為單獨(dú)的字段存入用戶賬號(hào)數(shù)據(jù)表中,用戶密碼則由密碼鹽和用戶名真實(shí)密碼按一定規(guī)則組合,然后通過(guò)散列加密函數(shù)進(jìn)行加密后再存儲(chǔ)。
(6)密碼驗(yàn)證時(shí),按照同樣的規(guī)則對(duì)用戶提交的密碼先進(jìn)行組合、散列,再與數(shù)據(jù)表中的用戶密碼進(jìn)行比對(duì)。
密碼鹽的程序?qū)崿F(xiàn)如下:
為提升用戶驗(yàn)證模塊的安全性能,本文基于PDO 接口,使用MVC 模式和面向?qū)ο蠓椒ㄔO(shè)計(jì)了一個(gè)用戶驗(yàn)證模塊,實(shí)現(xiàn)了單例模式的數(shù)據(jù)庫(kù)管理類(lèi),在業(yè)務(wù)流程中,驗(yàn)證碼由服務(wù)器端生成及驗(yàn)證。同時(shí),基于密碼鹽的方式來(lái)進(jìn)行密碼存儲(chǔ)和驗(yàn)證,并提供了一種生成密碼鹽的生成算法,通過(guò)提升隨機(jī)度和唯一性來(lái)增強(qiáng)密碼安全。