[security] 我應該在將密碼發送到服務器端之前對其進行哈希處理嗎?


4 Answers

由於它是通過HTTPS進行的,所以在沒有散列的情況下發送密碼絕對沒問題(通過HTTPS,它不是明文)。 此外,如果您的應用程序依賴於HTTPS以保證其內容的安全性,那麼在通過HTTPS發送密碼之前對密碼進行哈希是沒有用的(即如果攻擊者可以解密線路上的數據,則無論如何都會被搞砸)

Question

我注意到大多數站點通過HTTPS將密碼作為純文本發送到服務器。 是否有任何優勢,而不是我發送密碼的哈希到服務器? 會更安全嗎?




使用HTTP摘要 - 它甚至通過http保護密碼(但最佳用途是通過https進行http摘要)

維基百科:

HTTP摘要訪問身份驗證是Web服務器可以用來與Web用戶協商憑據(使用HTTP協議)的約定方法之一。 摘要式身份驗證旨在取代未加密使用的基本訪問身份驗證,允許安全地建立用戶身份,而無需通過網絡以明文形式發送密碼。 摘要式身份驗證基本上是MD5加密哈希的應用程序,使用nonce值來防止密碼分析。

鏈接: http://en.wikipedia.org/wiki/Digest_access_authenticationhttp://en.wikipedia.org/wiki/Digest_access_authentication

如果你想看到“真實生活”的使用,你可以看一下phpMyID - 一個使用http摘要認證的php openid提供者http://siege.org/phpmyid.php

..或者您可以從http://php.net/manual/en/features.http-auth.php的php auth示例開始

Http digest rfc: http://www.faqs.org/rfcs/rfc2617http://www.faqs.org/rfcs/rfc2617

從我的測試中,所有現代瀏覽器都支持它




通過線路發送哈希完全違背了哈希的目的,因為攻擊者可以簡單地發送哈希並忘記密碼。 簡而言之,一個在明文中使用哈希值進行體驗的系統是開放式的,並且只能通過網絡嗅探來妥協。




免責聲明:我不是一個安全專家 - 而且我希望其他人會批評我的立場過於謹慎或可以改進,我會從中學習。 話雖如此,我只想強調,當它離開你的客戶端時散列並不意味著你不必在將其放入數據庫之前在後端進行散列。

做到這兩點

兩者都是因為:

  1. 如果SSL連接受到損害,他們仍然無法看到原始密碼。 在能夠模仿授權用戶方面無關緊要,但它可以保護您的用戶免於與他們的電子郵件相關聯地閱讀他們的密碼。 大多數人不遵循最佳做法,並為他們的許多帳戶使用相同的密碼,因此這對您的訪問者來說可能是一個嚴重的漏洞。

  2. 如果某人能夠以某種方式從數據庫中讀取密碼(這確實發生了,請考慮SQL注入),他們仍然無法執行通過我的API模擬用戶的特權操作。 這是因為哈希不對稱; 即使他們知道存儲在您的數據庫中的哈希,他們也不會知道用於創建它的原始密鑰,而這正是您的身份驗證中間件用於進行身份驗證的內容。 這也是為什麼你應該總是為你的哈希存儲加鹽。

當然,如果他們可以自由地從數據庫中讀取他們想要的內容,他們可能會造成很多其他損害。

我只想在此強調,如果您決定在離開客戶之前對密鑰進行散列,那還不夠 - 後端散列是非常重要的,這就是為什麼:如果有人攔截了您的流量客戶端,然後他們將看到password字段的內容。 無論是哈希還是純文本,都無關緊要 - 他們可以逐字複製以模仿授權客戶端。 (除非你按照@ user3299591概述的步驟進行操作,我建議你這樣做)。 另一方面,散列數據庫列是必要的,並且根本不難實現。




散列密碼並通過非加密通道發送密碼實際上不太安全。 您將在客戶端上公開您的哈希算法。 黑客可以只是嗅探密碼的哈希值,然後用它來破解密碼。

通過使用HTTPS,您可以防止黑客從單一來源獲取密碼,因為HTTPS使用兩個加密的通道。




Related