2013-04-23 37 views
1

想象一下這種情況:你的用戶給你他們的憑據(用戶名/口令)來訪問第三方服務。所以當連接到服務時你必須產生這些憑據,你不能只存儲一個鹽漬散列。如何存儲的用戶名/密碼安全(散列不會做)在DB

環境是Grails,其中psql爲DB。從程序員的角度來看,理想情況下,用戶/密碼仍然是域對象的一部分(因此它們易於使用)。

安全存儲它們的最佳做法是什麼?

+1

我猜第三方服務不提供不錯,revokeable API密鑰/祕密的訪問? – 2013-04-23 09:27:45

+0

順便說一句,如果你的應用程序能夠解密/解碼這個證書,那麼一個黑客可以完全訪問你的應用程序,只需使用你現有的代碼即可。 – 2013-04-23 09:29:51

+0

@CraigRinger正確,沒有辦法 – Persimmonium 2013-04-23 10:02:16

回答

2

*(我不一個安全或加密專家,這是我的理解基於我的閱讀和研究,而且是很遠的權威意見獲得web應用安全專業人士的意見,並得到適當的。安全審計。)*

你真的可以做的是有你的應用程序無法對其進行解密,當用戶不積極。

加密登錄部分地基於用戶的原料用鑰匙憑據最好的,未加密的密碼。你從來沒有存儲用戶的密碼登錄到你的系統上的服務,當然,所以你只有在認證過程中短暫的時間訪問它(只有這樣,因爲網絡還沒有趕上90年代中期並採用了健全的質詢 - 響應認證方案)。您可以在用戶登錄時解密第三方服務保存的憑據,並將其存儲在易失性服務器端會話中以供用戶使用。

對於加密密鑰,您可以使用您爲每個(用戶,第三方憑據)對隨機生成的大型鹽值對用戶名和用戶原始密碼進行哈希加密,並將其與加密憑據一起存儲。鹽應該與用於存儲散列密碼的鹽不同。

這是很不理想,有各種各樣的問題 - 但用戶的會話過期或者他們登錄我們和你清除他們的會話後的憑證將無法訪問。

這也意味着你的應用程序不能代表其行事的時候都不會主動登錄,這可能是您根據您的要求了攪局者的限制。

疲軟的選擇是讓該應用程序重新啓動時手動真實由系統管理員輸入的所有用戶證書的關鍵。這個密鑰必須存儲在內存中,但它至少不在磁盤或數據庫中,因此有人竊取數據庫轉儲將難以解密存儲的憑證。

如果攻擊者找到一種方法來欺騙你的應用程序在解密後泄露這些域對象 - 或者讓它們冒充該用戶,讓它代表第三方服務執行操作另一個用戶等。它至少可以防止數據庫轉儲和類似攻擊的盜竊。

一個進一步的建議:與其使用pgcrypto在DB的密碼,這樣做在應用程序端。這意味着數據庫從不會看到解密數據所需的密鑰材料;它永遠不會被泄漏到數據庫日誌,嗅到了的pg_stat_activity

+0

感謝您的精心貢獻。你的第一個想法很棒......但不幸的是,對於我們來說,這是一個很好的選擇,我們需要在用戶沒有登錄時使用憑據。第二個建議是迄今爲止我得到的最好的結果......謝謝! – Persimmonium 2013-04-23 12:05:19

相關問題