根据Active DirectoryvalidationNT和LM散列

我正在使用NTLM协议编写Web应用程序身份validation用户。

我已经成功从客户端获取密码的NT和LM哈希值。 我如何validation他们对Active Directory以确保密码是正确的。

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

编辑 :我看不到回票的理由。 NTLM(v2)协议已经过时,所以很难find关于如何处理它的相关信息。 尤其是从C#这样的现代语言中。

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

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

我强烈建议你做一些研究 – 从这个问题的答案中读出那个文件将是一个好的开始 – 在这个问题收集更多的反对票之前。

你想要实现的是密码验证 – 是安全敏感的,这意味着正确理解底层技术和现代安全概念是很重要的。

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

NTLMv2 / NTLMv2会话使用这种技术 – 传统的NT / LM(现在非常沮丧)不这样做。

你只是不能把客户端对产生的一些挑战的反应,并把它传递给一个验证工具,因为这完全丧失了重放攻击的目的:这个工具将如何区分你和Joe Hacker你得到或产生自己的回应?

如何工作的方式是验证密码的实体(即活动目录)生成的挑战,而不是要验证其用户的Web服务器。

请不要在您的Web服务器中实现传统的NT / LM,并调用这个“安全性” – 事实上,它只会给您提供非常小的以纯文本格式发送密码的保护措施 – 破解所谓的“加密”使用今天的现代硬件。 阅读davenport文档,它列出了传统NT / LM的问题。

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

使用一个主动维护的外部工具,比如Samba,也意味着你会得到安全更新,因为如果你自己编写代码,那不仅仅是编写代码,还需要维护,需要注意安全问题,修复它们。