3

我正在使用 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. 这个想法很好,但不知道如何实现这一点。
4

1 回答 1

3

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

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

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

NTLMv2 / NTLMv2 Session 使用这种技术——传统的 NT/LM(现在非常不鼓励)没有。

您只是不能将客户对生成的某些挑战的响应传递给某个工具进行验证-因为这将完全丧失重放攻击抵抗的目的:该工具如何区分您和记录的 Joe Hacker你得到或产生他自己的回应?

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

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

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

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

于 2012-12-13T17:26:08.870 回答