2015-12-02 31 views
0

我正在用Spring MVC開發一個應用程序,我想將安全性方面添加到我的身份驗證中。如何加密數據庫中的數據並重用它來驗證用戶

在我的應用我有loginpassword是在數據庫中,誰可以訪問它可以看到loginpassword清楚任何一個registred。

我想在數據庫中加密數據,以便我確信沒有人可以使用或泄露它們。 我在網上搜索,但我發現有一些算法可能加密數據,如md5,但問題是不可逆的。

有些身體可以幫助我嗎?

回答

2

我同意丹尼H,但也想解決你的問題的另一半:保護登錄(通常是一個電子郵件地址)。大多數人忽略了保護它的需要,但是對於希望保持其客戶保密性的網站(不僅僅是阿什利麥迪遜,還有醫療網站),那麼你想爲其他數據添加一層保護。

首先,關於保護密碼的參考文獻:Secure Salted Password Hashing。使用bcrypt,scrypt,PBKDF2或argon2。

現在怎麼樣保護登錄?你實際上可以做一個類似的事情來保護它,但你需要一個固定的鹽(對於密碼,鹽不能被修復!)。我們假設bcrypt用於下面的示例。

考慮用戶如何登錄:用戶輸入他的登錄ID和密碼。系統將bcrypt應用於固定鹽的登錄ID在數據庫中查找用戶。由此,系統獲取用戶密碼salt,並且系統計算用戶提供的密碼與salt的加密,以查看它是否與數據庫中的散列密碼匹配。如果是這樣,用戶被授予訪問權限。因此,系統授予訪問權限,但不將用戶的登錄標識以明文形式存儲在數據庫中。

用戶忘記密碼怎麼辦?如果登錄ID是電子郵件地址,則沒有問題:用戶在忘記的密碼頁面上輸入登錄名(電子郵件地址),系統在用戶輸入的電子郵件地址上應用帶固定鹽分的bcrypt以查看用戶是否存在於數據庫中,並假設是,則電子郵件用戶密碼重置的祕密鏈接。在數據庫中,我們必須將該祕密鏈接關聯到該用戶,以確保他只重置他自己的密碼(不是別人的!)。

如果數據庫暴露出來怎麼辦?任何人都可以通過計算該用戶的電子郵件地址的bcrypt並查找數據庫中的匹配來確定特定用戶是否在數據庫中,但是沒有人能夠扭轉整個電子郵件地址集,這是一個重大改進目前的情況。

我在我的博客超過2個月前討論過這個想法,請參見:https://littlemaninmyhead.wordpress.com/2015/09/08/a-retrospective-on-ashely-madison-and-the-value-of-threat-modeling/

+0

是的,絕對同意和一些偉大的點! –

2

爲什麼密碼的加密是不可逆轉的問題?

當用戶創建一個帳戶,鹽和散列他們的密碼保存之前。我更喜歡使用bcrypt

當用戶登錄時,可以使用bcrypt的checkpw將用戶憑證與保存在數據庫中的散列值進行比較。讓他們不可逆轉(不可解密)確保如果有人獲得訪問你的分貝,他們並沒有得到你所有的用戶密碼以及

我以前沒有用過java的BCrypt,但我只是瞥了一眼this tutorial,它似乎喜歡它可能是一個很好的起點,你

編輯:剛剛意識到他用jBCrypt,但在這兩個的區別應該是非常小的

EDIT2:Here是破解一個相當不錯的文章在數據庫中找到的密碼和I的原因建議bcrypt以及爲什麼你應該使用單向加密功能

+0

哈希是不加密的。 –

+0

是的,你是正確的,可能應該有不同的措辭,並會相應地編輯我的答案。在他所問的用例中,只是散列密碼並保存它們應該沒問題。在閱讀你的答案後,我很好奇爲什麼你認爲有必要加密已經哈希的密碼 –

+0

我也想補充一下,我敢肯定有時候可能需要加密哈希密碼。我只是覺得它可能是一個額外的複雜程度,90%的時間沒有實質性的好處。我並不是真的與你爭論,只是誠實好奇,想要像我一樣精通 –

0

MD5是一個hash函數,它是不可逆的 - 它不是一個加密函數。哈希每次給定的輸入都會有相同的輸出,這就是它們工作的原因。哈希會在你描述的場景中起作用,因爲可以看到哈希的用戶不會知道原始密碼 - 這就是說,這聽起來似乎是個壞主意。

理想情況下,你會散列密碼,然後加密哈希和其他用戶將無法看到這些值加密或不。這將是我的建議,但如果您選擇只加密密碼RSA encryption將工作得很好。

相關問題