userPassword 属性在 LDAP 中如何工作?

userPassword 属性在 LDAP 中如何工作?

我刚刚学习LDAP,有些东西我不太明白。

当我们在目录中创建用户时,我们使用 来定义他们的密码userPassword。当我们使用例如该{SSHA}方案时,据我所知,它的工作原理如下:我们获取明文密码,向其中添加一些随机盐,然后将其全部哈希化。

编辑:所有这些都在 LDAP 之外!

然后,我们采用这个散列密码+盐,并将该值存储在userPassword属性中。

现在,假设我有一些应用程序需要使用此目录对用户进行身份验证。该应用程序提示用户输入用户名和密码。现在,应用程序查询目录以搜索相关的用户条目。

然后,应用程序需要将用户输入的密码与userPassword属性进行比较。但这是我不明白的——应用程序如何知道用户首次注册到目录时生成的随机盐?

答案1

然后,应用程序需要将用户输入的密码与 userPassword 属性进行比较。但这是我不明白的 - 应用程序如何知道用户首次注册到目录时生成的随机盐?

盐始终存储在哈希旁边。根据格式,它可能在视觉上分开(例如 /etc/shadow“crypt”用于将$盐与哈希分开)或可能组合在一起(例如 LDAP{SSHA}将在 Base64 编码内组合 X 字节盐 + Y 字节哈希)。

用户密码字段是只写的,我无法检索它

这是因为通常不是对密码进行哈希处理和比较的应用程序,以及执行此操作的 LDAP 服务器本身,以及 LDAP 的“比较”操作是不是用于此目的。

相反,应用程序将使用 LDAP‘绑定’操作并尝试以用户身份“登录”到 LDAP 服务器。这样,应用程序就不需要对 salt/hash 值具有“读取”权限,甚至不需要实际支持 LDAP 服务器使用的哈希算法。

(事实上​​,LDAP 服务器甚至可能根本不存储哈希值 - 例如 OpenLDAP 可能使用{SASL}将密码验证转移到完全独立的系统(如 Kerberos)。所有这些对于使用 LDAP“绑定”来验证密码的程序来说是完全不可见的。)

要通过 CLI 工具模拟这一点,您需要:

  1. 与 web 应用程序的专用凭据一起使用ldapsearch,在目录中搜索用户的 DN(因为用户只提供用户名)。

  2. 使用ldapsearch -D <user_dn> -w <user_passwd>进行身份验证,忽略搜索结果(因为没有 CLI 工具可以仅有的绑定)。

    • 大多数程序不使用 CLI;它们直接使用 LDAP 客户端库,因此它们可以独立调用 ldap_simple_bind() 并在知道结果后立即解除绑定。

    • 然而,一些 Web 应用在此步骤中进行实际的 LDAP 搜索,使用用户自己的权限读取用户自己的 DN 条目 - 例如,检索 Web 应用程序自己的帐户无权读取的某些字段。

    • 如果您不关心结果,查找 rootDSE-b "" -s base几乎就是“无操作”搜索。您也可以使用 而ldapwhoami不是ldapsearch(但并非所有 LDAP 服务器都支持“WhoAmI”exop,例如 AD 就不支持)。

相关内容