2012-11-08 120 views
3

我知道,出於安全原因,有必要對用戶的密碼進行哈希處理並將其與存儲的哈希密碼進行比較,如果其他人獲取哈希的字符串,他將無法計算回密碼或在彩虹表中查找密碼。使用PHP和javaScript登錄解決方案的密碼哈希

有一部分方法我不明白。比方說,我有這個標準的登錄表單

<form method='post' action='login.php'> 
    <input type='text' name='user' /> 
    <input type='password' name='password' /> 
    <input type='submit' name='submit' value='login' /> 
</form> 

,然後我使用PHP登錄

<?php 
    if(isset($_POST['submit'])){ 
     $username = $_POST['username']; 
     $password = sha1($_POST['password']); 
     $authorize = $login_object->login($username, $password); 
    } 
?> 

,並在幕後,$login_object需要與數據庫進行驗證,並返回真/假的照顧。 (我做了這個對象,我有真正的,有用的對象來做到這一點)

但這意味着POST request中的密碼傳播了原始,未散列和不安全!任何人都可以截獲真正的密碼!

所以我在想的是我應該使用JavaScript來散發密碼發送之前。我將有一個隱藏字段<input type='hidden' name='real_password' value='' />,並且將javaScript複製輸入密碼的值,對其進行散列,將其放入real_password隱藏輸入中並將密碼字段留空。這樣,POST request將具有哈希密碼,而不是原始的,不安全的原始密碼。

我說得對,或者我應該在PHP上做哈希?

+4

如果使用Javascript對散列密碼進行登錄,則登錄所需的實際密碼將成爲散列密碼,該密碼仍然會通過原始和未加密的線路傳播。要安全地將用戶瀏覽器的密碼傳輸到服務器,您需要使用SSL。 – Kelvin

+1

只需使用SSL ....您還應該查看[password_compat](https:// github。com/ircmaxell/password_compat)一​​種簡單而有效的密碼哈希方法 – Baba

+0

使用HTTPS而不是HTTP。 – nickhar

回答

5

散列保證數據在服務器端的安全。要保護數據流到服務器,請使用HTTPS。在這方面,密碼或其散列是否被盜(以後重複)在線上沒有區別。 HTTPS還授予證書以確保在用戶瀏覽器中顯示掛鎖(請記住,不要在沒有正確認證的頁面中輸入重要密碼)。

+0

感謝您的回答! – Daniel

3

我的評論,作爲一個答案;)

如果你使用Javascript散列密碼,然後登錄所需的實際密碼變爲散列密碼,仍然行進在原絲和加密。要安全地將用戶瀏覽器的密碼傳輸到服務器,您需要使用SSL。

+0

感謝您的回答! – Daniel

3

正如許多評論者所說,安裝SSL證書將防止任何竊聽,所以您不必擔心這一點。通過HTTP發送它是不加密的,並且容易被竊聽,特別是在不安全的無線網絡上。

至於在客戶端對密碼進行哈希處理,更好的辦法是查看客戶端SSL證書,這些證書實際上是由瀏覽器本身生成的(假設您已經安裝了SSL證書來加密連接)。只需在您的HTML中添加一個<keygen>標記,您的瀏覽器就會生成一個密鑰對並將其私鑰存儲在其密鑰存儲區中(example)。然後,在訪問該站點時,用戶將公鑰發送到服務器進行身份驗證。不幸的是,它在所有當前的瀏覽器中都有點混亂,並且根本無法使用Internet Explorer(驚喜,驚喜,謝謝,微軟!)。

+1

傳爲福音的人+1。關於'keygen'標籤的很好的討論,有很多參考資料,在這裏:http://stackoverflow.com/questions/4501196/keygen-tag-in-html5 – Kelvin