2013-01-24 68 views
2

我正在與一個寵物項目合作,並且我想要添加用戶註冊支持。經過一番研究,我決定在我的數據庫中保存散列密碼和鹽,而不是原始密碼。不過,我很困惑步驟是什麼,以什麼順序。下面是我的假設:如何在網上散列和加密密碼?

註冊

  1. 客戶端發送到服務器(HTTPS)
  2. 服務器抓起密碼的用戶名和密碼,生成一個隨機的鹽
  3. Base64編碼,鹽
  4. 使用stringify鹽散列密碼
  5. Base64編碼密碼
  6. 保存密碼和鹽,放入數據庫

登錄

  1. 客戶端發送到服務器的用戶名和密碼(HTTPS)
  2. 服務器抓取的用戶名和密碼,查詢從數據庫哈希PSW和鹽
  3. 使用鹽的散列密碼,base64對結果進行編碼
  4. 將密碼與數據庫中散列的psw進行比較
  5. 如果匹配,驗證用戶

我實現我的系統作爲我的假設,一切似乎工作。但是我不確定base64編碼部分。密碼和salt從二進制到字符串編碼的目的是什麼?我可以跳過這一步嗎?如果我假設的過程是錯誤的,那麼正確的步驟是什麼?

PS我使用express.js作爲服務器,MySQL作爲數據庫

+1

對散列密碼進行Base64編碼通常是爲了更容易存儲,特別是如果散列函數輸出二進制。如果你有一個好的持久化方法可以處理原始二進制文件,那麼編碼是無關緊要的。 – Joe

+0

@Joe謝謝喬!所以一切都是爲了? –

回答

3

總的想法是好的,但我有一些話:

  • 而不是使用哈希,你應該使用PBKDF,一種基於密碼的密鑰推導函數。最好使用標準化版本,即PBKDF2。與salt一起,你還應該選擇一些迭代來阻止攻擊。
  • 請確保您始終對用戶名和密碼使用相同的字符編碼。
  • 密碼算法應該基於二進制輸入和輸出。
  • 當您將二進制數據存儲或加載到文本演示文稿時,應分別使用Base 64編碼/解碼。

所以該方案包含了以下問題:

  • 使用散列函數而不是PBKDF。
  • 使用base 64編碼的鹽作爲散列的輸入。
+0

感謝您指出了這些,是的,我使用PBKDF2,但我認爲這是一個散列函數:P(不是嗎???) –

+0

嗯,我想你可以調用一個PBKDF設置迭代計數和鹽散列函數,但最好將其稱爲基於密碼的密鑰導出函數以避免混淆。大多數人會認爲MD5或SHA-1或類似的。 –

0

您需要了解鹽的含義。它只是爲了防止使用彩虹桌進行可能的暴力攻擊。這意味着一些壞人會嘗試高計算能力的所有可能的哈希。然後嘗試從這樣的散列中提取純文本。
因此,鹽在那裏,以確保即使這種攻擊返回的純文本是不正確的。

例如: 用戶名: 「Xavier_Ex」 密碼: 「Ilovestackoverflow」

這種密碼將被散列到 「sfhj87s &^F」。現在彩虹桌也可以說 「sfhj87s &^f」 - > Ilovestackoveroverflow ...呃,你的密碼破解了。

但是,當鹽漬時它會像「Ilovestackoveroverflow」 - >「Io * ves5tacmkove3rflow」。 當這是哈希「Io * ves5tacmkove3rflow」 - >「dfgdfgdf」

與彩虹表,「dfgdfgdf」將返回「Io * ves5tacmkove3rflow」..您的密碼仍然是祕密。

總之..你可以跳過這個,除非你確實需要這樣的保護。

+0

除非有技術上的原因,你不應該跳過鹽漬 - 彩虹桌非常受歡迎,因爲它很容易破裂 – Patashu

+0

@blackmath首先感謝你的回答,但如果你仔細閱讀我的問題,我不會問鹽。是的,我明白什麼是鹽,但我問的是base64編碼鹽和密碼的步驟。 –

+3

這個答案似乎從根本上誤解了salt如何保護密碼...... salt是公共信息,通常存儲在密碼的哈希旁邊,並且只是附加到密碼的末尾。通過確保每個密碼需要獨立暴力破壞,每個用戶的獨特salt可以防止攻擊者 –