2011-10-23 174 views
0

我甚至不知道在這裏問什麼問題。我的問題陳述很簡單:我需要使用salt在數據庫上存儲密碼,根據存儲的密碼驗證輸入的密碼,並在用戶嘗試登錄時使用隨機挑戰字驗證密碼。我使用的是php/javascript。如何驗證和驗證密碼?

在試圖解決這個問題時,我遇到的問題是,如果我在html表單中傳遞一個質詢詞,然後將輸入的密碼與該詞進行哈希,我可以在服務器上驗證密碼,但是我不能將密碼與質詢詞分開,以便我可以根據DB上的醃製密碼對其進行驗證。如果我以明文方式將密碼發送到服務器,或者在沒有提示字的情況下發送密碼,我可以驗證它,但現在我無法可靠地對其進行身份驗證。

我想我需要某種形式的2路算法,這樣我就可以一鍵加密,然後在驗證密碼進行驗證的關鍵。我該怎麼做?或者如果它不能完成那麼我該怎麼做?

+0

要清楚,隨機挑戰是爲了在運輸過程中保護密碼?或者是一種認證機制來證明他們是人類或類似的? –

+0

爲了解決這個問題,我查看了一個名爲「Geeklog - 安全CMS」的PHP博客的源代碼。瞧,他們發送他們的用戶密碼是免費和清晰的,他們使用服務器上的MD5來「編碼」密碼。所以也許我的問題應該是「我應該使用鹽和質詢詞來實現密碼驗證和認證的類型的系統?」 – James

+0

也phpBB似乎發送密碼自由和明確。我想我一直在想這個問題。 – James

回答

0
  1. 要存儲密碼,請生成隨機鹽。店鋪HASH(password+salt)salt。 (服務器或客戶端可以執行此計算。)

  2. 要執行身份驗證,服務器將查找saltHASH(password+salt)。然後它會產生一個隨機挑戰,並將鹽和挑戰發送給客戶。

  3. 在客戶端上,提示用戶輸入密碼。計算:
    HASH(HASH(password+salt) + challenge)。將它發送到服務器。

  4. 在服務器上,您已經有HASH(password+salt),並且您有challenge。所以你也可以計算:
    HASH(HASH(password+salt) + challenge)。將此與客戶發送給您的內容進行比較。如果它們匹配,則密碼是正確的。

請注意,這易受MITM攻擊影響,所以應該通過本身受保護的連接(例如SSL連接)使用它。

+0

這聽起來像我想要一個2步登錄過程:1)用戶提交用戶名,服務器查找用戶併發送鹽和挑戰2)用戶輸入密碼並提交。 – James

+0

在將客戶端發送到服務器之前,密碼在客戶端上散列沒有任何優勢。這只是不必要地使客戶端代碼複雜化。 – NotMe

+0

好處是服務器不能放棄密碼。例如,服務器經常結束日誌記錄密碼,並且這些日誌文件有時會受到損害。如果服務器沒有看到密碼,則無法記錄或妥協。 (是否值得付出努力是另一個問題。) –

2

加密與客戶端腳本密碼通常是一個壞主意。正確的方法是使用SSL。

此外,從未存儲密碼以明文的形式。如果您必須使用像你上面描述的一個方法,哈希密碼兩次:一次將其存儲在數據庫中,另一次爲雙向認證。