2010-05-09 231 views
5

因此,我正在開發一個移動平臺應用程序,我希望用戶通過網絡進行身份驗證。我想知道做安全的最好方法。用戶正在向HTTP服務器發送一個密碼給一個php服務器,這個服務器需要在同一臺服務器上對一個mysql數據庫進行驗證。很明顯,我不想通過互聯網以純文本的形式發送密碼,但我也不想做2次SHA哈希。通過網絡發送密碼

這是服務器看起來像(僞代碼)

$pass = $_POST['pass']; 

if ((get PASSWORD where USERNAME = USERNAME) == SHA($pass)) return PASS; 

這是非常標準的,我不認爲有任何其他的方式來做到這一點。但我想知道如何在通過互聯網發送數據之前準備數據。

回答

10
  1. 如果你想要安全,你。必須。使用。 HTTPS。擁有適當的非自簽名證書。不管你做什麼,通過未加密通信進行身份驗證的身份都是微不足道的。 (不要介意密碼,攻擊者可以簡單地竊取隨每個請求提供的會話cookie。)
  2. 散列本身是毫無價值的,你必須用它來騙取它。 (這與認證無關 - 當有人竊取你的數據庫時,這是第二層防禦措施,如果你成爲一個有前途的目標,遲早會發生這種情況。)使用長隨機每用戶鹽的bcrypt,沙*由於速度太快而不安全。
  3. 使用大型安全感知項目已在使用的方法。這些方法在一定程度上經受住了時間的考驗。有一些基於challange-response的方法可以避免以任何形式發送密碼,但是加密非常困難,並且非常容易以不安全的方式實現安全算法。使用良好的安全框架(例如PHPass),不要依賴未廣泛使用的代碼。
+0

+1比我的更詳細的答案。 – 2010-05-09 11:24:46

+0

謝謝你們的答案。我對Web編程不太熟悉,我想是時候研究一下安全問題了。是否有任何指南可以讓我看到這些技術如何協同工作的整體情況?只是爲了獲得更多信息,這是一個android程序,用戶必須在應用程序中創建用戶名/密碼,然後我將爲用戶實現一個Web界面,以便能夠與手機進行交互。所以通過互聯網發送密碼的唯一時間是用戶創建。 – Falmarri 2010-05-10 14:32:22

4

如果您的客戶端應用程序支持它,則可以使用SSL

0

正如Pekka指出的那樣,SSL是您的最佳選擇。

作爲一種替代方案,在JavaScript中使用SHA非常簡單,快速,並且它已經被編寫。 Here's an example這裏是一個庫:crypto.js

+0

沒有必要自己實現它。有很好的libs已經這樣做了。例如Crypto.js,我在這裏寫下了它:http://techpriester.tumblr.com/post/547863016/crypto-js-by-jeff-mott – selfawaresoup 2010-05-09 09:41:14

+0

我向上帝發誓,我的鏈接中有一個示例庫;)讓我改說一下,所以它更清晰。 – 2010-05-09 10:04:24

0

對於普通的非關鍵系統,大多數網站在發送http請求時通過Internet以純文本格式發送密碼。然後通過SHA1/MD5對密碼進行服務器端編碼,並根據數據庫中的值進行檢查。

您也可以使用https basic authentication,這將使用簡單的算法對密碼進行編碼。但是,雖然它不以純文本發送密碼,但編碼非常簡單,非常容易破解。但通過使用基本身份驗證,您不能使用常規登錄表單,您需要使用瀏覽器對基本身份驗證的支持(用戶界面不太友善!)。

如果您需要更多安全性,大多數網站只需安裝您在ISP購買的服務器端SSL證書(例如godaddy)。這將使您可以通過SSL加密連接訪問您的登錄腳本。此解決方案被認爲是安全的(只要密碼不容易被猜出或被盜)。

另一個有趣的但不常見的方法是在對服務器(JS sha-1 example)執行(Ajax)發佈請求之前,在JavaScript中執行SHA1編碼。從理論上講,這可以提供相當合理的安全...

如果這一切仍然不夠,你可以考慮安裝client certificates或一個計算器或短信的響應挑戰系統。

+3

我不同意在發送之前進行sha1編碼。這樣sha1散列只是作爲密碼,任何嗅探網絡流量的人都可以將散列發送到服務器而無需知道原始密碼。此外,這使得不支持JS的人無法訪問它,或者這意味着您的服務器必須檢測發送了哪種密碼(散列或不散列)。 – 2010-05-09 10:09:47

+3

服務器可以發送鹽,客戶端可以計算鹽漬散列,附加一個隨機字符串,再次散列,發回第二個散列和隨機字符串,服務器可以通過將隨機字符串附加到存儲的密碼散列並再次散列。拉(你需要兩個登錄請求)有點複雜,但是對於可以監控通信但不能拉中間人攻擊的攻擊者是合理安全的。當然,無論如何,他會竊取會話cookie。 – Tgr 2010-05-09 11:15:19

+0

@Tgr:隨機字符串的第二個哈希如何幫助使事情更安全?如果第一次散列(散列密碼+鹽)容易受到重放攻擊,則第二個散列根本無濟於事,因爲攻擊者將重放相同的「隨機」字符串。 – 2010-05-09 11:55:41