不少應用須要客戶首先進行註冊,而後使用用戶名、密碼進行驗證,以前在爲一個分佈式系統添加認證模塊的時候,遇到一個問題,這裏進行簡要的分析。linux
認證的兩種主要形式:windows
1. 單機登陸認證:如windows、linux系統用戶登陸,這種應用的程序代碼一般是不公開的,用戶要正常的使用系統,必須越過這一障礙。服務器
2. 網絡登陸認證:如QQ、飛信等聊天軟件的用戶登陸,這種應用的代碼能夠是開源的,由於即便即便代碼開源,hacker去掉了客戶認證的代碼,從新編譯運行,服務器發現記錄客戶端的登陸狀態爲未登陸,客戶端仍是不能繼續工做。網絡
項目中遇到的問題:分佈式
客戶端經過掛載後,像使用本地文件系統同樣使用遠程文件系統。登陸認證在掛載的時候進行,用戶名密碼必須是服務器linux系統上的用戶,服務器爲每一個用戶創建單獨的用戶文件夾存儲用戶數據。編譯
在簡單的添加了認證過程後,客戶端必須經過認證才能正常使用系統,之後客戶端的請求數據中都包含了用戶名信息。但因爲登陸模塊是硬加到掛載過程當中的,並且系統是開源的,若是hacker在使用前,在客戶端代碼中將認證的代碼去掉,是能夠直接使用文件系統的。解決的方法是:相似於經常使用的網絡應用,在服務器端記錄用戶的登陸狀態,此時hacker即便去掉登陸的代碼,仍不能正常使用系統,由於服務器端的狀態標識其未登陸。登錄
這樣作仍然存在問題,客戶端每次請求都包含用戶名,服務器只是檢測該用戶是否已經登陸,若是hacker去掉登陸代碼並僞造本身的身份,修改請求中的數據,若是該用戶剛好爲已經登陸的用戶,hacker仍是有機可趁。解決該問題的方法:客戶在登陸成功後,服務器爲其生成一個隨機通訊碼,之後客戶端的請求中將包含用戶名與對應的隨機通訊碼,服務器只有檢測到用戶名與隨機通訊碼都匹配時才相應客戶端的請求。服務器端