你能计算出 Active Directory 使用的密码哈希吗?
Posted
技术标签:
【中文标题】你能计算出 Active Directory 使用的密码哈希吗?【英文标题】:Can you calculate the password hash used by Active Directory? 【发布时间】:2016-01-19 12:31:06 【问题描述】:我们目前将 Web 应用程序的用户及其密码的哈希值/盐值存储在我们的数据库中。哈希值是在创建用户并设置密码并存储在数据库的用户表中时计算的。
创建用户帐户后的一段时间,我们可能想在我们的域中创建一个 windows 帐户,并希望能够设置域用户的密码,使其与用户用于登录的密码相同网络应用程序。由于我们不保存密码的纯文本版本,因此我们无法在创建密码时将其发送到 AD。
我正在考虑解决此问题的一种方法是计算 AD 在用户首次设置密码时使用的所有不同密码哈希,然后在我们创建用户时以某种方式在 AD 中设置记录。
-
您将如何使用 .Net 创建散列(我认为它们是 MD4、MD5 和 DES)?
您能否绕过在 UserPrincpal.SetPassword 上创建密码,并进行其他调用以直接设置 AD 存储的哈希值?
似乎应该有办法做到这一点,因为 MS 有用于将密码从 AD 同步到 Azure 用户的工具。
【问题讨论】:
有趣的问题,但我认为这只有在您使用与 Windows 相同的盐时才有效?!?从安全角度来看:在两个系统上使用相同的密码是个好主意吗?我会说您正在寻找的是单点登录解决方案 问题是,据我所知,Windows 在单点登录方面表现不佳,除非它是“单点”登录点。不知何故,MS 有同步密码的工具,所以我相信它一定是可能的。 根据您的 Web 应用程序运行的位置,您可以将 SSO 与各种技术一起使用:SAML、Kerberos、证书。但请继续尝试实施同步方法,不要忘记这可能带来的安全隐患。 SSO 中的第一个 S 有时更代表“沉默”而不是单个 ;-) AD 到 Azure 访问复制 API 并从 AD 中提取密码哈希,重新哈希它们,然后通过加密通道将它们发送到 Azure AD。在真正算作远程支持的方式之后,没有办法将哈希值推送到 AD。 Brian,我不确定您所说的“将真正算作远程支持的方式”是什么意思 【参考方案1】:尝试将 AD 密码与 DB 密码保持同步是一个坏主意,原因有两个:
这是一个安全漏洞(cmets 已经通过提及盐指出了这一点) 这是一个维护问题。由 Windows PC 发起的密码更改将保持 DB 密码不变。不要使用相同的密码创建 Windows 帐户,而是更改您的 Web 应用程序的身份验证以使用 AD 身份验证和 Windows 窗体身份验证。这样一来,他们的 AD 凭据(如果他们有的话)将取代用户名/密码提示。
【讨论】:
是的。一旦创建了 AD 帐户,Op 就可以在数据库中设置一个标志。然后使用此标志来确定是针对数据库还是针对 AD 进行身份验证。针对 AD 进行身份验证的一种非常简单的方法(当以负责任和安全的方式使用时)是 AccountManagement 类的 PrincipalContext.ValidateCredentials Method。 +1 答案:)【参考方案2】:避免持有 a) 可以取回明文的加密密码,b) 弱散列,如果数据库被内部/外部攻击者破坏,这两个都是坏主意。
您可以考虑另一种方法: * 使用长的、随机的、未知的密码为用户创建 AD 帐户。在帐户上放置一个“ADPasswordLastSet=null”时间戳。 * 下次该用户登录您的 Web 应用程序时,在对其进行身份验证后,您将获得明文密码,因此将 AD 用户的密码设置为相同。不要忘记更新 ADPasswordLastSet 标志。
因此,如果您可以同步设置密码,您就不必在任何地方写密码。
要记住的一件事:密码复杂性政策 - 您要确保用户与之交互的 UI 中存在的政策具有更严格的政策。
【讨论】:
以上是关于你能计算出 Active Directory 使用的密码哈希吗?的主要内容,如果未能解决你的问题,请参考以下文章
我如何在 SQL SERVER 2008 中使用 Active Directory 用户进行身份验证但没有 Windows 身份验证