2015-10-20 106 views
14

我們目前在我們的數據庫中存儲我們網絡應用程序的用戶以及密碼的哈希/鹽。當創建用戶並設置其密碼並存儲在數據庫中的用戶表中時計算散列值。您可以計算Active Directory使用的密碼哈希值嗎?

創建用戶帳戶後的一段時間,我們可能希望在我們的域中創建一個Windows帳戶,並希望能夠設置域用戶的密碼,以便它與用戶用於登錄的密碼相同進入網絡應用程序。由於我們不保存純文本版本的密碼,因此我們無法在創建密碼時將其發送給AD。

我想要解決這個問題的一種方法是,計算AD在用戶首次設置密碼時使用的所有不同密碼哈希值,然後在創建用戶時以某種方式在AD中設置記錄。

  1. 如何使用.Net創建散列(我認爲它們是MD4,MD5和DES)?
  2. 您可以繞過UserPrincpal.SetPassword創建密碼,並進行其他調用以直接設置AD存儲的哈希值嗎?

似乎應該有辦法做到這一點,因爲MS有工具可以將AD從AD密碼同步到Azure用戶。

+0

有趣的問題,但我認爲這隻會在你使用與Windows相同的鹽時才起作用。從安全角度來看:在兩個系統上使用相同的密碼是個好主意嗎?我會說你正在尋找的是解決方案上的單一標誌 – Marged

+0

據我所知,問題在於,Windows在單點登錄方面表現不佳,除非它是登錄的「單一」點。不知何故MS有工具來同步密碼,所以我相信它一定是可能的。 – bpeikes

+0

根據您的Web應用程序在哪裏運行,您可以使用各種技術的SSO:SAML,Kerberos,證書。但請不斷嘗試實施同步方法,並且不要忘記這可能具有的安全隱患。 SSO中的第一個S有時比單個更「無聲」;-) – Marged

回答

5

試圖保持與DB密碼同步的AD密碼是有兩個原因一個壞主意:

  • 這是一個安全漏洞(評論已經指出了這一點,通過提鹽)
  • 這是一個保養問題。由Windows PC啓動的密碼更改會使DB密碼保持不變。

而是創建一個Windows使用相同密碼的帳戶,改變你的web應用驗證使用 AD身份驗證和Windows窗體身份驗證。這樣,他們的AD憑證(如果他們有)將取代用戶名/密碼提示。

+0

是的。一旦創建了AD帳戶,Op可以在數據庫中設置一個標誌。然後使用此標誌來確定是針對數據庫還是針對AD進行身份驗證。對AD進行身份驗證的一種非常簡單的方法是*(PrincipalContext.ValidateCredentials方法)(https://msdn.microsoft.com/zh-cn/library/system.directoryservices.accountmanagement.principalcontext)。 (AccountManagement](https://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement(v = vs.110).aspx)類的validatecredentials(v = vs.110).aspx)。 +1的答案:) – Abhitalks

0

避免保留a)一個加密的密碼,您可以獲得明文,b)弱散列,這些都是壞的想法,以防數據庫受到內部/外部攻擊者的破壞。

你可以考慮一種不同的方法: *爲用戶創建一個長的隨機未知密碼的AD帳戶。在帳戶上放置一個'ADPasswordLastSet = null'時間戳。 *下次用戶登錄您的Web應用程序,在對其進行身份驗證後,您的密碼將清空,以便將AD用戶的密碼設置爲相同。不要忘記更新ADPasswordLastSet標誌。

因此,如果您可以同步設置密碼,則無需在任何位置寫入密碼。

需要記住的一件事:密碼複雜性策略 - 您要確保UI中與用戶交互的策略具有更嚴格的策略。