2011-12-29 58 views
4

關於如何存儲用戶密碼的Stack Overflow有很多問題,當然一般建議是散列密碼和比較散列。當散列不適用時將密碼存儲在數據庫中

但是,想象你正在構建一個人們在自己的環境中部署的shrinkwrap內聯網應用程序(如SharePoint)。假設它需要用戶名/密碼組合才能通過HTTP訪問外部服務(不支持依賴於API密鑰或聯合安全性的解決方案)。

在這種情況下,我們不能散列密碼,因爲我們需要將原始密碼傳遞給我們所調用的Web服務。加密將是第二好的解決方案,但我們將使用什麼加密密鑰?如果受到攻擊會破壞數據庫,那麼他們可能會首先訪問用於加密數據的任何密鑰?

如果您確實需要獲取存儲密碼的純文本版本,您將如何以最安全的方式處理問題?

回答

2

這實際上是一個非常有趣的問題。我會加入。

您應該在存儲它時加密它。無論你如何看待它,都比以純文本存儲更好。假設攻擊者發現一個sql注入廣告轉儲數據庫,他仍然沒有加密密鑰。另一方面,如果他訪問服務器,他可能會找到加密密鑰。

爲了改善這一點,您可以將加密密鑰存儲在服務器配置中。假設你使用Apache,你可以使用SetEnv

在我的環境中,我需要在Apache啓動時輸入加密密鑰,然後將其存儲爲en環境變量,因此密鑰並不真正存儲在我的服務器上的任何位置。

沒有辦法,除非你要求用戶輸入一個密鑰來解密你將100%安全的密碼。

1

你有問題倒置。問題不在於如何讓消費者「查看」密碼;問題是如何讓消費者驗證身份驗證。

在您的實施中,提供一種方法,讓消費者可以提供密碼和用戶名,並獲得yes或no。然後,您繼續在數據庫中存儲加密(不散列)的密碼。

+0

應用程序不向用戶顯示密碼;它在調用Web服務時將密碼作爲基本HTTP憑據發送。用戶在將Web服務「添加」到應用程序時輸入一次密碼。 – 2011-12-30 01:13:54

2

您可以從用戶的密碼生成加密密鑰。 (不是他們的外部服務密碼 - 他們服務的密碼。)由於您沒有以純文本格式存儲他們的密碼,因此攻擊者破壞數據庫將無法解密密碼。不利之處在於,無論何時需要他們的外部密碼,您都必須要求他們輸入密碼(用於您的服務)。

+0

在這種情況下,每次都無法讓用戶輸入密碼,但如果是這樣的話,這真是個好主意! – 2011-12-30 01:16:32

相關問題