回答
我這個答案早些時候書面但後來重新考慮,因爲我沒有聽到DPAPI之前。但是,經過進一步考慮,我想提出以下意見。不過,這裏的重要前言是,這一切都取決於你的需求。兩個相互衝突的可能性浮現在腦海中:
你要提供你的用戶完整的保護,用戶可以只相信她將能夠解密,無論在何種情況加密。
您是一位企業IT經理,並且所有員工都緊箍咒。您希望他們將業務數據加密爲工作流程的一部分,以便他們無法看到彼此的數據,但管理員可以愉快地閱讀每個人的數據。
如果您處於情況(2),則立即停止閱讀,然後使用適合該情況的DPAPI。如果你更喜歡場景(1),那麼請閱讀下面我的原始答案。
這可能不是一個好主意。原因如下:
實際的密碼不會被存儲在系統上(除非你有Windows 3.11或類似的東西)。相反,只有密碼散列將被存儲,並且在登錄時,用戶輸入的密碼被散列並與存儲的散列進行比較。
所以最好你可以從系統中檢索存儲的散列(如果你有管理員權限的話)。但是,如果這是您可以繼續執行的唯一數據,那麼您製作的任何加密密鑰都將從該散列派生,而不是從實際的密碼派生。因此,任何有權訪問系統的人都可以訪問存儲的散列,並從中輕鬆導出加密密鑰。
總之,不要。要求用戶爲您的數據提供專用的新密碼,並僅用於此。
您可以使用DPAPI並仍然要求用戶輸入專用密碼。這就是CryptProtectData中的可選熵參數。 –
是的,但OP似乎想專門使用登錄密碼。當然,您可以使用DPAPI作爲(1)的實現。 –
同意。讓我強調一下你的最後一段:請求**專用**密碼,而不是登錄密碼,並明確說明。請不要訓練用戶在他們被問到的任何地方鍵入他們現有的密碼。 –
Windows Data Protection API聽起來像你所需要的。 CryptProtectData and CryptUnprotectData函數使用當前用戶的登錄憑據執行加密。
我想知道:系統管理員能夠恢復足夠的信息以「解除」受系統上任何用戶保護的數據嗎?文章說,憑證本質上只是一個密碼哈希。 –
@Kerrek:它使用登錄憑據。可選的熵參數很好,可選。管理員可以模擬任何人,但DPAPI不能在模擬下工作(因爲此原因,我不得不放棄使用它)。它可以被哄起來工作,但需要一些努力。 –
我的意思是稍微低一點:由於加密只是使用密碼散列作爲密鑰的一些衆所周知的密碼,因此管理員可以從系統中檢索所有散列並直接解密該blob,而不是? –
使用Kerberos(基於Linux的認證服務器或其他使用Kerberos的服務器)/ LDAP框架(Windows服務器)而不是設計自己的登錄算法。
Windows平臺SDK &第三方庫具有這些框架的連接器。在MSDN有關Kerberos
How to safely store a password
的Win32 bcrypt:http://msdn.microsoft.com/en-us/library/aa375421%28v=vs.85%29.aspx
問題是關於加密數據,而不是存儲密碼。 –
- 1. 使用DES和密碼進行加密
- 2. 使用passport.js進行密碼加密
- 3. PHP:使用bcrypt進行密碼加密
- 4. 使用密鑰文件進行加密,使用密碼進行解密
- 5. 如何使用用戶密碼進行aes加密?
- 6. 使用用戶輸入密碼進行DES加密
- 7. 使用簡單的替換密碼進行加密和解密
- 8. AWS使用什麼密碼/密鑰進行AES-256加密?
- 9. 未加密密碼的加密密碼用戶羣
- 10. 使用Java進行AES加密並使用Javascript進行解密
- 11. 使用PGP進行加密並使用GPG進行解密
- 12. 使用主密鑰進行Python加密
- 13. 使用C++進行加密和解密
- 14. 使用OpenSSL密鑰進行Java加密
- 15. 使用字典進行加密/解密
- 16. 使用用戶提供的密碼短語對數據庫進行加密
- 17. Swift - 使用用戶密碼加密和解密字符串
- 18. 不使用密碼實例或密鑰進行加密和解密
- 19. 使用Javascript加密密碼
- 20. 使用CFB 128位AES加密對數據進行加密/解密的代碼
- 21. 僅使用java中的密碼加密對字符串字符進行加密
- 22. 使用來自javax的密碼進行加密
- 23. 使用Spring/Hibernate進行密碼加密 - Jasypt或其他東西?
- 24. 密碼加密使用opencart數據庫進行全網登錄
- 25. 使用DirectCompute進行AES加密/解密的示例代碼
- 26. 在Java中使用MD5和Salt進行密碼加密
- 27. 使用ansible對加密AWS .pem密鑰文件進行加密
- 28. 存儲密碼進行用戶登錄
- 29. 登錄加密密碼進行比較
- 30. 使用ASCII編碼(ASP.NET)進行加密與使用UTF-8編碼進行加密(Silverlight)
只是爲了明確這一點:你希望最終能夠恢復你正確的加密數據?您不是試圖存儲用戶的密碼,而是使用它來派生加密密鑰,對嗎? –
絕對正確! – TCS