在閱讀了一些在線文章和文章之後,似乎大多數人(如果不是全部的話)建議使用某種哈希算法來保持用戶的密碼安全,因爲您無法解決它,這很好,但那是我開始對我的情況有問題的地方。選擇哈希或加密密碼的困境
現在我正處於修改我們確保用戶密碼方式的初期階段。我們目前使用Sha512將密碼密碼存儲在我們的MySQL DB中。根據我目前的理解,雖然散列可能是安全的,因爲它們不能相反(或者至少不那麼容易),但它也是不安全的,因爲有可能發生衝突,因爲散列具有固定的長度,不管大小如何原始輸入,這限制了可能的散列數量,從而導致可能的Pidgeon Hole問題。
現在來了另一個我有問題的部分,特別是對於我的情況。
我想添加一些功能,我們的用戶的密碼,如果用戶不能輸入一個新的密碼,如果它是過於相似,他們的最後三個密碼。例如:如果他們的最後一個密碼是password1234
而他們的新密碼是xxxpasswordxxx
,那麼它會失敗。但是,從我的理解來看,我不可能添加此功能,因爲我無法解決他們以前的密碼,以檢查舊密碼中是否有子字符串在其新密碼中。這將我帶到整個加密/解密部分。
我一直在尋找AES 128使用CBC加密模式,它似乎是一個可靠的選擇,因爲我真的不在乎在加密部分的並行化。除此之外,通過使用加密路線而不是散列路線,我實際上可以檢查他們的最後三個密碼是否與他們當前的密碼相似!但是,首先可以看到用戶的純文本密碼的問題是存在的。
此外,我一直在想辦法爲每個單獨的密碼使用唯一密鑰,而不將它存儲在我們的數據庫中,因爲我覺得這太不安全了。我可以對所有密碼使用靜態隨機密鑰,但我不確定這是否是一個好主意,即使我爲所有密碼使用了獨特的IV。
因此,總結我的情況是這樣的: 我希望能夠防止用戶輸入類似於他們的舊密碼的密碼,除了實際上提高密碼存儲的安全性。根據我目前的知識,我可以繼續將密碼存儲爲散列,但我無法進行類似的密碼檢查,或者我可以對密碼進行加密,這是令人不悅的。
我顯然不是這方面的專家,而且我知道我需要做更多的研究,但我想確保自己是從正確的方向開始的。
爲什麼要阻止用戶輸入類似於舊的密碼? –
@BilalBOUTAYA我們增加了一個功能,在X天后他們必須更改密碼。讓他們將密碼從「password123」更改爲「password1234」是完全沒有意義的。雖然這是一個有效的變化,但它們仍然過於相似,這可能是一個弱點。 –
強迫用戶首先更改密碼完全毫無意義。結果是用戶在顯示器旁邊的便箋上以簡單的形式寫下密碼。或者導致他們使用更簡單更簡單的密碼(不是你想要的) – luk2302