簡體   English   中英

當密碼未以純文本形式存儲在數據庫中時,如何驗證用戶?

[英]How users are verified when passwords are NOT stored as plain text in the database?

我知道將密碼以明文形式存儲在數據庫中是不好的,因為如果黑客獲得對服務器數據庫的訪問權限,所有用戶名和密碼都會完全暴露? 因此,原始密碼通過hash函數,之后以一串等長的不可理解字符的形式存儲在DB中。 這對安全來說是一件好事。

但是......服務器如何驗證用戶是否輸入了正確的密碼? 由於用戶在其原始 forms(例如:whoami、ilovecomputer...)中輸入密碼,但服務器將它們存儲在“散列”forms(例如:234203409803249580980gfdg41cdvd4、jknegnergiuhiuhdni4584234dfgbn4j...)下。 如何匹配用戶輸入的密碼和服務器存儲的密碼?

H為密碼散列值 function。這些函數的一個簡單屬性是它們具有確定性,即相同的輸入輸出相同的值。

第一次:當用戶在網站上注冊時,他們需要用戶的密碼,通常是兩個字段。 現在密碼被散列h = H(passwd)並存儲在用戶的數據庫中。

稍后時間:用戶輸入用戶名和密碼,然后服務器使用用戶名從數據庫中獲取h 也散列當前輸入的密碼pwd 如果H(pwd) = h那么輸入的密碼是正確的。 您的服務器允許用戶繼續使用系統。

以上是密碼系統的基礎知識,但是,這還不夠。 密碼散列的一些要點;

  1. 對於密碼散列,我們至少不直接使用加密散列。 密碼散列需要很快,但是,密碼散列需要很慢,甚至可以通過可調整的迭代來控制緩慢。 這有助於系統適應所需的安全性。
  2. 我們使用鹽來對抗彩虹攻擊; 每個用戶的隨機鹽將防止彩虹攻擊。 我們還使用胡椒粉作為域分離的服務器鹽。
  3. 我們需要內存硬密碼散列來防止大量 GPU/ASIC/FPGA 密碼搜索。 有關密碼散列的一些比較,請參見 hashcat。
  4. 也需要針對並行化的線程。
  5. 我們使用專門設計的密碼哈希算法,如 PBKDF2、Scrypt、Argon2。 Argon2 是最新密碼哈希競賽的獲勝者。 建議大家在新系統中使用 Argon2id。

最后一點也是最重要的一點是向用戶介紹密碼。 首先介紹dicewire或類似的密碼生成方法,其次介紹給1passwords等密碼管理器。

以下是如何在不以明文形式存儲密碼的情況下對用戶進行身份驗證。

您將需要兩個數據庫列來執行此操作。 第 1 列 - 密碼 Hash,第 2 列 - 鹽

第 2 列 - Salt 是您的代碼/系統為每個用戶生成的隨機生成值,它是隨機的,不會暴露給任何 UI 或后端系統。 (我會在下面解釋使用)

第 1 列 - 將是用戶密碼的哈希值 +(連接)鹽。

您可以在此處閱讀有關哈希的更多信息Common Hashing Algorithms

整個事情是如何運作的:

哈希:哈希是一種基於算法為每個字符串創建唯一值的方法。 唯一性因算法而異,但除非您有大量記錄,否則應該沒問題。 此外,每個字符串的 HASH 值都是唯一的。 意味着字符串“test”的 Hash 將始終相同,假設為“123”

Salt: Salt 只是添加到每個密碼的隨機字符串。 這樣 HASH 值被計算為用戶的密碼 + SALT。 這樣可以確保即使多個用戶使用相同的密碼,他們的密碼 Hash(HASH(密碼+Salt))也是唯一的。

設置密碼

  • 當用戶設置他們的密碼時,他們將提供一個密碼。
  • 您的代碼將隨機生成一個“鹽”值。
  • 將創建第三個變量 PasswordAndSalt = password + salt。
  • 然后會生成第四個變量 hashValue = HASH(PasswordAndSalt)。
  • 然后,您可以將 hashValue 保存在密碼 Hash(第 1 列)中,將 Salt 保存在 Salt(第 2 列)中。

添加 SALT 是一種反制措施,因此如果兩個用戶使用相同的密碼,HASH 的值仍然會不同。

驗證用戶當用戶輸入他們的用戶名和密碼時,這就是您的代碼將如何執行。

檢查用戶名是否存在。

  • 如果用戶名存在,獲取其 SALT 值。
  • 獲取用戶提供的密碼並連接您從數據庫獲得的 SALT 值。
  • 計算密碼 + SALT 的 HASH 值
  • 如果計算出的 HASH 值與數據庫中的 SALT 值匹配,則對用戶進行身份驗證。
  • 否則,告訴用戶認證失敗。

暫無
暫無

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

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