验证针对Active Directory的NT和LM哈希值

时间:2012-12-12 13:16:36

标签: c# windows authentication hash active-directory

我正在使用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完成解包。这个想法很好,但不知道如何实现这一目标。

1 个答案:

答案 0 :(得分:3)

我强烈建议你做一些研究 - 从这个document的答案中读取other question将是一个好的开始 - 在此问题收集更多的下选票之前。

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

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

NTLMv2 / NTLMv2会话使用这种技术 - 传统的NT / LM(现在非常气馁)不会。

您无法接受客户对生成的挑战的回应,并将其传递给某个工具进行验证 - 因为这样会完全丧失重播攻击抵抗的目的:如何工具可以区分你和Joe Hacker,他们记录了你得到的反应或者自己创造的反应?

这样做的方式是验证密码的实体(即Active Directory)产生挑战,而不是想要验证其用户的Web服务器。

请不要在你的网络服务器中实现传统的NT / LM并称之为“安全性” - 事实上,它只会给你提供很少的保护,而不是用纯文本发送密码 - 这真的很简单快速使用当今的现代硬件打破所谓的“加密”。阅读该davenport文档,它列出了传统NT / LM的问题。

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

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