[英]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
那么輸入的密碼是正確的。 您的服務器允許用戶繼續使用系統。
以上是密碼系統的基礎知識,但是,這還不夠。 密碼散列的一些要點;
最后一點也是最重要的一點是向用戶介紹密碼。 首先介紹dicewire或類似的密碼生成方法,其次介紹給1passwords等密碼管理器。
以下是如何在不以明文形式存儲密碼的情況下對用戶進行身份驗證。
您將需要兩個數據庫列來執行此操作。 第 1 列 - 密碼 Hash,第 2 列 - 鹽
第 2 列 - Salt 是您的代碼/系統為每個用戶生成的隨機生成值,它是隨機的,不會暴露給任何 UI 或后端系統。 (我會在下面解釋使用)
第 1 列 - 將是用戶密碼的哈希值 +(連接)鹽。
您可以在此處閱讀有關哈希的更多信息Common Hashing Algorithms
整個事情是如何運作的:
哈希:哈希是一種基於算法為每個字符串創建唯一值的方法。 唯一性因算法而異,但除非您有大量記錄,否則應該沒問題。 此外,每個字符串的 HASH 值都是唯一的。 意味着字符串“test”的 Hash 將始終相同,假設為“123”
Salt: Salt 只是添加到每個密碼的隨機字符串。 這樣 HASH 值被計算為用戶的密碼 + SALT。 這樣可以確保即使多個用戶使用相同的密碼,他們的密碼 Hash(HASH(密碼+Salt))也是唯一的。
設置密碼
添加 SALT 是一種反制措施,因此如果兩個用戶使用相同的密碼,HASH 的值仍然會不同。
驗證用戶當用戶輸入他們的用戶名和密碼時,這就是您的代碼將如何執行。
檢查用戶名是否存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.