簡體   English   中英

使用PHP和javaScript登錄解決方案的密碼哈希

[英]password hashing for login solution with PHP and javaScript

我知道,出於安全原因,有必要對用戶的密碼進行哈希(使用salt)並將其與存儲的哈希密碼進行比較,因此如果其他任何人獲得哈希字符串,他將無法計算密碼或外觀它在彩虹桌上。

我不明白這個方法的一部分。 假設我有這個標准的登錄表單

<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負責對數據庫進行身份驗證並返回true / false。 (我做了這個對象,我有真實的,有用的對象來做這個)

但這意味着POST request的密碼是原始的,未散列的,不安全的! 任何人都可以攔截真實密碼!

所以我想的是我應該在發送之前使用javascript來密碼密碼。 我會有一個隱藏字段<input type='hidden' name='real_password' value='' />並且讓javaScript復制輸入名為password的值,將其哈希,將其放入real_password隱藏輸入並清空密碼字段。 這樣, POST request將具有哈希密碼,而不是原始的,不安全的原始密碼。

我說的是對的,還是我應該在php上進行哈希?

Hashing可以保護服務器端的數據。 要保護數據流到服務器,請使用HTTPS。 在這方面,密碼或其哈希是否在線路上被盜(並且稍后重復)沒有區別。 HTTPS還授予證書以確保在用戶的瀏覽器中顯示掛鎖(切記在沒有適當認證的情況下永遠不要在頁面中輸入重要密碼)。

我的評論,作為答案;)

如果您使用Javascript對密碼進行哈希處理,則登錄所需的實際密碼將成為哈希密碼,該密碼仍然通過原始和未加密的線路傳輸。 要將密碼從用戶的瀏覽器安全地傳輸到服務器,您需要使用SSL。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM