非计算机专业该学习Java还是Python
由于服务器发送了挑战(1),并且客户端使用其秘密的哈希值对该挑战进行加密,然后使用其用户名(2)将其发送回服务器,因此服务器将在其SAM中查找用户密码的哈希值数据库(3)。收到挑战后,它还将加密先前使用此哈希(4)发送的挑战,并将其结果与用户返回的挑战进行比较。如果相同(5),则说明用户已通过身份验证!否则,用户没有提供正确的秘密。 域帐户 当使用域帐户进行身份验证时,用户的NT哈希不再存储在服务器上,而是存储在域控制器上。用户希望对其进行身份验证的服务器接收其挑战的答案,但无法检查该答案是否有效。它将把这个任务委托给域控制器。 为此,它将使用Netlogon服务,该服务能够与域控制器建立安全连接。此安全连接称为安全通道,之所以可以进行这种安全连接,是因为服务器知道自己的密码,而域控制器也知道服务器密码的哈希值,他们可以安全地交换会话密钥并安全地进行通信。 我不会详细介绍,但是想法是服务器将以NETLOGON_NETWORK_INFO的结构将不同的元素发送到域控制器: 1. 客户端的用户名(Identity); 2. 先前发送给客户端的挑战(LmChallenge); 3. 客户端发送的对挑战的响应(NtChallengeResponse)。 域控制器将在其数据库中查找用户的NT哈希,对于域控制器,它不在SAM中,因为它是一个试图进行身份验证的域帐户。这次它位于一个名为NTDS.DIT的文件中,该文件是所有域用户的数据库。检索NT哈希后,它将使用该哈希和挑战计算预期的响应,并将此结果与客户的响应进行比较。 然后,一条消息将被发送到服务器(NETLOGON_VALIDATION_SAM_INFO4),指示客户端是否经过身份验证,它还将发送一组关于用户的信息。这与使用Kerberos身份验证时在PAC中发现的信息相同。
以下就是一个域控制器的验证过程: 综上所述,当客户端进行身份验证时,它使用其密码的MD4指纹来加密挑战。然后,让我们看看接收到此响应后服务器端会发生什么。 身份验证 如前所述,有两种不同的身份验证情况。首先,用于身份验证的帐户是一个本地帐户,因此服务器知道这个帐户,并拥有该帐户的秘密副本。第二种是使用域帐户,在这种情况下服务器不知道这个帐户或它的秘密,它必须将身份验证委托给域控制器。 本地帐户 在使用本地帐户进行身份验证的情况下,服务器将使用用户的密钥(更确切地说是用户秘密的MD4哈希) 对发送给客户端的挑战进行加密。然后,它将检查其操作的结果是否等于客户端的响应,从而证明用户拥有正确的秘密。如果没有,则用户使用的密钥不是正确的,因为挑战的加密没有给出预期的密钥。
为了执行此操作,服务器需要存储本地用户及其密码的哈希。这个数据库的名称是SAM(安全帐户管理器)。可以在注册表中找到SAM,特别是使用regedit工具时,但只能作为系统访问。不过,还可以使用psexec打开: NTLM交换框顶部是红色的,底部是服务器响应CHALLENGE_MESSAGE中包含的信息。在这些交换之后,服务器拥有两件东西: 1. 发送给客户端的挑战; 2. 客户端的响应被自身的秘密加密了。 要完成身份验证,服务器只需检查客户端发送的响应的有效性。但在那之前,让我们来检查一下客户的秘密。 身份验证的秘密
我们说过,客户端使用一个哈希版本的密码作为密钥,原因如下:为了避免在服务器上以明文形式存储用户密码,它是存储的密码的哈希值。现在,此哈希是NT哈希,它不过是MD4函数的结果,不含盐值。 (编辑:鞍山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |