此過程看起來非常複雜。實際上,您正在向存儲的散列(您的散列密碼的過程)添加服務器端祕密。只要程序保密,這確實會增加安全性。換句話說,如果攻擊者只能讀取數據庫的訪問權限(SQL注入),那麼您有一個優勢,只要他擁有服務器上的權限並知道代碼,就沒有任何優勢。
雖然有一個更容易和更安全的方式來獲得這種優勢。只需用隨機鹽計算BCrypt哈希(大多數實現都會這樣做),然後使用服務器端密鑰(例如AES)對此哈希值進行加密。密鑰不應該從其他參數詮釋,而應該使用足夠長且足夠隨機的密鑰。
我試圖解釋我的教程中關於safely storing passwords的原因,也許你想看看它。
編輯:
好吧,我現在明白了,你要處理的登錄名像第二密碼,並不會存儲它明文,而不是你只存儲它的BCrypt哈希與全球「鹽」。
讓我們假設您願意花費1秒CPU時間進行密碼散列。在你的方案中,你必須將其分成半秒以散列登錄名和半秒密碼。攻擊者必須第一步暴力登錄名和密碼。
- 登錄名通常是非常弱的密碼。雖然人們知道密碼需要強大,但登錄名通常只包含一個帶有數字的名稱並且很短。
- 您需要使用登錄名的哈希來查找數據庫記錄,因此您不能使用隨機鹽,而需要使用全局「鹽」。這允許構建一個單一的彩虹表來一次性破解所有用戶名。可以預先計算重要的登錄名,如「admin」。
- 爲了避免重複,您必須使用大寫/小寫的登錄名,這會進一步縮小搜索空間。
這意味着您花費了半秒鐘的時間處理一個非常弱的密碼(登錄名),然後半秒鐘的正常密碼。與正常(希望強大)的密碼投資1秒相比,您可能會降低安全性,但無論如何我看不出任何優勢。
如果您的管理員離開並接收數據庫,則無法更改某些安全參數。退出的管理員將擁有用戶名,密碼以及恢復它們的方法。 – jww
你指的是什麼安全參數?鹽以及散列的登錄名和密碼將全部存儲在數據庫中。 – antelopecarbuilding395
身份驗證如何? – Gumbo