【问题标题】:Validate NT and LM hashes against Active Directory针对 Active Directory 验证 NT 和 LM 哈希
【发布时间】:2012-12-12 13:16:35
【问题描述】:

我正在编写使用 NTLM 协议对用户进行身份验证的 Web 应用程序。

我已成功从客户端获取密码的 NT 和 LM 哈希值。如何针对 Active Directory 验证它们以确保密码正确。

我正在使用 C#,但我认为我也可以调用原生库。

编辑:我看不出拒绝投票的理由。 NTLM(v2) 协议已经过时,因此很难找到有关如何处理它的相关信息。尤其是在像 C# 这样的现代语言中。

但我发现了两种可能的方法:

  • 使用 Windows 的本机 SSPI 调用(Microsoft 不推荐),但可以通过适当的包装。幸运的是,有一个例子:http://pinvoke.net/default.aspx/secur32/InitializeSecurityContext.html 这种方法似乎奏效了。我能够验证帐户。但是仍然存在一些问题。例如在客户端的 HTTP 请求之间传输有关服务器安全上下文的信息、调用不安全的代码以及无法在其他系统上执行此类操作。
  • 尝试解开通过System.Net.Security.NegotiateStream 完成的调用。这个想法很好,但不知道如何实现这一点。

【问题讨论】:

标签: c# windows authentication hash active-directory


【解决方案1】:

我强烈建议您进行一些研究 - 从您的 other question 的答案中阅读 document 将是一个好的开始 - 在此问题收集更多反对票之前。

您尝试实施的密码验证是安全敏感的,这意味着正确理解底层技术和现代安全概念非常重要。

现代安全架构的一个重要设计方面是抵抗所谓的重放攻击:防止窃听客户端和服务器之间连接的人记录身份验证挑战并在以后重放它。

NTLMv2 / NTLMv2 Session 使用这种技术 - 旧版 NT/LM(现在非常不鼓励)不使用。

您只是不能将客户端对 生成的某些挑战的响应传递给某个工具进行验证 - 因为这将完全丧失抗重放攻击的目的:那怎么办工具可以区分您和 Joe Hacker,后者记录了您获得的响应或生成了他自己的响应?

其工作原理是验证密码的实体(即 Active Directory)生成质询,而不是想要对其用户进行身份验证的 Web 服务器。

请不要在您的网络服务器中实现旧版 NT/LM 并将其称为“安全性”——事实上,与以纯文本形式发送密码相比,它只会为您提供很少的保护——它真的很简单而且很快使用当今的现代硬件来破解所谓的“加密”。阅读 davenport 文档,它列出了旧版 NT/LM 的问题。

如果您真的想要 NTLM(它的更安全版本),可以使用一些外部帮助程序。例如看看 Samba、Apache 和 Squid。 Squid 使用一些外部工具来处理我认为基于 Samba 的工具的 NTLM。

使用积极维护的外部工具(例如 Samba)也意味着您将获得安全更新,因为如果您自己编写代码,这不仅仅是编写代码,还需要维护,您需要注意安全问题并修复它们。

【讨论】:

  • 感谢您的回答!很遗憾,这个问题被否决了。甚至在我提出第一个问题之前,我就已经看过那份文件。问题是我必须使用这个 SSPI 功能没有 C# 绑定。微软网站强烈反对直接使用它,不提供任何东西(我应该算System.Net.Security.NegotiateStream我可以在网络中使用的替代方案吗?)我正在使用 NancyFx 框架开发 Intranet 网站,没有任何其他选择,除了来解决方案。我知道 NTLM 的弱点,但似乎每个人都在内部使用它。
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多