2010-08-18 70 views
0

我正在構建一個Web服務,它接受其他服務的憑據並以用戶名義輪詢這些服務。也就是說 - 考慮一個電子郵件聚合服務 - 在各種不同的電子郵件提供商處對您的帳戶進行輪詢,並將它們整理到一個列表中。哪種編碼用於存儲可解密的密碼?

在這種情況下,用戶提供的密碼必須能夠被webapp解密,所以它們可以被傳遞給各種服務進行認證。

我應該如何存儲這些密碼?

我讀過關於在db中存儲密碼的各種帖子(答案總是'不'),但在這種情況下,我看不到另一種方法。 (雖然歡迎,但建議)

回答

0

讓我們在這裏澄清:服務器必須能夠恢復明文密碼。

考慮一些事情你可以做:

  • 加密與密鑰密碼。將密鑰存儲在配置文件中。
  • 用智能卡/黑匣子加密密碼。
  • 通過發送HTTPS請求,在另一臺服務器的幫助下加密/解密密碼。
  • 用RAM中的密鑰加密密鑰。使用mlock()來阻止它被交換到磁盤。希望你不必重新啓動。

如果攻擊者有根目錄(但沒有任何內容),它們都不會幫助你。如果攻擊者切斷電源並竊取數據包,它們大部分都不會幫助你(RAM不像你想要的那樣是非易失性的)。

你試圖抵禦什麼攻擊?你忽略了什麼攻擊?

一種可能性是使用從用戶密碼派生的密鑰(如OSX的Keychain和Windows的無人使用的等效密碼存儲)對密碼進行加密。當用戶登錄到您的Web服務時,您可以將密鑰保留在會話中(或使用一次性鍵盤異或將其存儲在cookie中,並且只在用戶發送請求時恢復密鑰)。這使得從數據庫備份中竊取外部密碼至少與破解用戶密碼一樣困難。不過,這對其他人來說並沒有什麼幫助。