馬杰 蔡妹
(海南軟件職業技術學院 海南省瓊海市 571400)
用戶驗證是信息管理系統中的一個重要模塊,是保障信息安全的第一道屏障。當前,基于用戶名和密碼的用戶驗證依然是各類應用系統主要的用戶身份驗證方式之一,特別是在中小型信息管理和Web 系統中。由于網絡數據傳輸的開放性、用戶使用弱密碼、軟件開發者缺乏信息安全意識等原因,靜態的用戶名和密碼存在比較大的安全風險,容易受到攻擊,網絡上用戶信息泄露的事件也層出不窮。對應用開發者來說,提升用戶驗證的安全性是一項迫切的任務。
作為一個輕量級的數據庫訪問接口,PDO 的運行效率、可移植性、安全性都有了大幅度提升。基于PDO 接口,結合面向對象和MVC 開發模式,融入通過密碼鹽和散列函數實現的加密算法,封裝一個具有良好安全性、復用性、可擴展性的用戶驗證模塊,不僅可以有效提升信息安全,還可以簡化開發難度、提高開發效率。
如圖1 所示,User 類作為實體類與數據表user 進行對應,在User 類中實現對userName、userPassword 等各個成員變量的set/get訪問器方法。UserDAO 類基于User 類實現的數據存取操作。其中,getuserID()方法用來返回一個用戶的ID,getUser()用來返回一個User 類型的對象,getAllUsers()用戶返回所有用戶的對象鏈表。從安全性角度出發,所有SQL 處理的語句按照prepare()和execute()的方式進行實現。
Captcha 類為在服務器端生成驗證碼的工具類,該類中定義一個createImg()方法,通過隨機函數在數組中選擇4 個數字或者字母作為驗證碼,并通過PHP 圖形圖像繪制的方式返回一張圖片。這種設計讓驗證碼在服務器端生成,可以有效防止客戶生成端驗證帶來的安全隱患。
DataCheck 作為一個工具類用來在服務器端對各種用戶輸入提交的數據進行合法性驗證,例如用戶名、密碼、表單信息等,通過在服務器端對用戶提交數據的合法性驗證、防SQL 注入檢查,可以避免Web 前端驗證被繞過的風險,提升系統安全性。
PDOManager 類作為PDO 接口的具體實現,用來封裝數據庫連接的相關操作,考慮到數據庫訪問的頻繁度,本文采用單例模式進行實現,確保數據庫連接實例具有唯一性,減少系統資源消耗,提升運行效率。基于單例模式的PDO 管理類PDOManager 的實現如下:


如圖2 所示,用戶輸入用戶名、密碼、驗證碼進行登錄,驗證碼圖片對象由服務器端生成并發送到到客戶端,用戶表單提交的驗證碼首先與Session 中的驗證碼原始值進行對比驗證,不通過則清除掉Session 中的驗證碼原始值,然后重新調用Captcha 類新生成新的驗證碼和圖片對象。驗證碼驗證通過后,再調用DataCheck 工具類對用戶名、密碼進行合法性驗證,然后消除字符串中可能存在的SQL 安全隱患。在完成這兩步驗證之后,由UserDAO 對象通過單例模式的PDOManager 對象進行數據庫訪問操作,通過prepare()和execute()的方式執行SQL 查詢,判斷用戶名和密碼是否正確。在判斷時,密碼由用戶密碼和密碼鹽經過散列函數運算后生成。這樣,既保證了即使在服務器端用戶密碼也不可見,也可以增強密碼安全性,減低。
密碼鹽是指在密碼的某個任意位置加入特定字符串,讓散列運算后的結果與原始密碼直接散列運算出的結果不同。其關鍵在于特定字符串的選擇,構建一個隨機度高且具有唯一性的字符串作為密碼鹽,可以有效降低被針對固定散列值的彩虹表攻擊的命中率。
為了確保密碼鹽的隨機性和唯一性,設計如下算法:
(1)首先自定義一個可選擇字符串集合,然后通過str_shuffle()函數隨機打亂集合中的字符串順序。
(2)從打亂順序的字符串集合中選取一個隨機的起始位置,截取一段字符串出來作為密碼鹽前綴。隨機位置通過mt_rand()函數實現,截取子串通過substr()函數實現。mt_rand()函數使用Mersenne Twister 算法作為隨機數發生器返回隨機整數,它產生隨機數值的平均速度比作為rand()隨機數發生器的libc 快四倍。
(3)將一個固定常量字符串和時間戳進行字符串連接,并對這個字符串通過uniqid()函數生成唯一ID。

圖1:模塊類圖

圖2:模塊時序圖
(4)將密碼鹽前綴和ID 進行字符串拼接,并通過散列加密函數進行加密,此時生成的加密字符串就是密碼鹽。
(5)將密碼鹽作為單獨的字段存入用戶賬號數據表中,用戶密碼則由密碼鹽和用戶名真實密碼按一定規則組合,然后通過散列加密函數進行加密后再存儲。
(6)密碼驗證時,按照同樣的規則對用戶提交的密碼先進行組合、散列,再與數據表中的用戶密碼進行比對。
密碼鹽的程序實現如下:

為提升用戶驗證模塊的安全性能,本文基于PDO 接口,使用MVC 模式和面向對象方法設計了一個用戶驗證模塊,實現了單例模式的數據庫管理類,在業務流程中,驗證碼由服務器端生成及驗證。同時,基于密碼鹽的方式來進行密碼存儲和驗證,并提供了一種生成密碼鹽的生成算法,通過提升隨機度和唯一性來增強密碼安全。