你能算出Active Directory使用的密码哈希吗?

时间:2015-10-20 17:57:54

标签: .net active-directory password-encryption

我们目前在我们的数据库中存储我们的Web应用程序的用户,以及他们的密码的哈希/盐。哈希是在创建用户时计算的,并设置其密码并存储在数据库的User表中。

在创建用户帐户后的某个时间,我们可能希望在我们的域中创建一个Windows帐户,并希望能够设置域用户的密码,使其与用户登录的密码相同网络应用程序。由于我们不保存密码的纯文本版本,因此我们无法在创建密码时将其发送到AD。

我考虑解决此问题的一种方法是计算用户首次设置密码时AD使用的所有不同密码哈希值,然后在创建用户时以某种方式在AD中设置记录。< / p>

  1. 如何使用.Net创建哈希(我认为它们是MD4,MD5和DES)?
  2. 您是否可以绕过UserPrincpal.SetPassword上的密码创建,并进行其他调用以直接设置AD存储的哈希值?
  3. 似乎应该有办法实现这一点,因为MS有从AD到Azure用户同步密码的工具。

2 个答案:

答案 0 :(得分:5)

尝试保持AD密码与数据库密码同步是一个坏主意,原因有两个:

  • 这是一个安全漏洞(评论已经通过提及盐来指出这一点)
  • 这是一个维护问题。由Windows PC启动的密码更改将使DB密码保持不变。

不是使用相同的密码创建Windows帐户,而是更改Web应用程序的身份验证以使用 AD身份验证和Windows窗体身份验证。这样,他们的AD凭证(如果有的话)将取代用户名/密码提示。

答案 1 :(得分:0)

避免持有a)加密密码,你可以得到明文,b)弱哈希,如果数据库被内部/外部攻击者破坏,这两者都是坏主意。

您可以考虑采用不同的方法: *使用长而随机的未知密码为用户创建AD帐户。放一个&#39; ADPasswordLastSet = null&#39;帐户上的时间戳。 *下次用户登录您的网络应用程序时,在对其进行身份验证后,您将获得明确的密码,因此请将AD用户的密码设置为相同。别忘了更新ADPasswordLastSet标志。

因此,如果您可以同步设置密码,则无需在任何地方写密码。

要记住的一件事:密码复杂性策略 - 您希望确保用户与之交互的UI中存在的策略具有更严格的策略。