2011-09-06 133 views
5

我想使用WINAPI在Windows機器上使用登錄用戶密碼來加密給定數據。我一直在尋找一個使用令牌(或類似的東西)的函數,但我找不到一個。使用用戶密碼進行加密

有誰知道該怎麼做?

謝謝! :-)

+1

只是爲了明確這一點:你希望最終能夠恢復你正確的加密數據?您不是試圖存儲用戶的密碼,而是使用它來派生加密密鑰,對嗎? –

+0

絕對正確! – TCS

回答

3

我這個答案早些時候書面但後來重新考慮,因爲我沒有聽到DPAPI之前。但是,經過進一步考慮,我想提出以下意見。不過,這裏的重要前言是,這一切都取決於你的需求。兩個相互衝突的可能性浮現在腦海中:

  1. 你要提供你的用戶完整的保護,用戶可以只相信她將能夠解密,無論在何種情況加密。

  2. 您是一位企業IT經理,並且所有員工都緊箍咒。您希望他們將業務數據加密爲工作流程的一部分,以便他們無法看到彼此的數據,但管理員可以愉快地閱讀每個人的數據。

如果您處於情況(2),則立即停止閱讀,然後使用適合該情況的DPAPI。如果你更喜歡場景(1),那麼請閱讀下面我的原始答案。


這可能不是一個好主意。原因如下:

實際的密碼不會被存儲在系統上(除非你有Windows 3.11或類似的東西)。相反,只有密碼散列將被存儲,並且在登錄時,用戶輸入的密碼被散列並與存儲的散列進行比較。

所以最好你可以從系統中檢索存儲的散列(如果你有管理員權限的話)。但是,如果這是您可以繼續執行的唯一數據,那麼您製作的任何加密密鑰都將從該散列派生,而不是從實際的密碼派生。因此,任何有權訪問系統的人都可以訪問存儲的散列,並從中輕鬆導出加密密鑰。

總之,不要。要求用戶爲您的數據提供專用的新密碼,並僅用於此。

+0

您可以使用DPAPI並仍然要求用戶輸入專用密碼。這就是CryptProtectData中的可選熵參數。 –

+0

是的,但OP似乎想專門使用登錄密碼。當然,您可以使用DPAPI作爲(1)的實現。 –

+0

同意。讓我強調一下你的最後一段:請求**專用**密碼,而不是登錄密碼,並明確說明。請不要訓練用戶在他們被問到的任何地方鍵入他們現有的密碼。 –

7

Windows Data Protection API聽起來像你所需要的。 CryptProtectData and CryptUnprotectData函數使用當前用戶的登錄憑據執行加密。

+0

我想知道:系統管理員能夠恢復足夠的信息以「解除」受系統上任何用戶保護的數據嗎?文章說,憑證本質上只是一個密碼哈希。 –

+0

@Kerrek:它使用登錄憑據。可選的熵參數很好,可選。管理員可以模擬任何人,但DPAPI不​​能在模擬下工作(因爲此原因,我不得不放棄使用它)。它可以被哄起來工作,但需要一些努力。 –

+0

我的意思是稍微低一點:由於加密只是使用密碼散列作爲密鑰的一些衆所周知的密碼,因此管理員可以從系統中檢索所有散列並直接解密該blob,而不是? –

0

使用Kerberos(基於Linux的認證服務器或其他使用Kerberos的服務器)/ LDAP框架(Windows服務器)而不是設計自己的登錄算法。

Windows平臺SDK &第三方庫具有這些框架的連接器。在MSDN有關Kerberos

的更多信息:http://msdn.microsoft.com/en-us/library/ff649429.aspx

相關問題