我刚刚学习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 工具模拟这一点,您需要:
与 web 应用程序的专用凭据一起使用
ldapsearch
,在目录中搜索用户的 DN(因为用户只提供用户名)。使用
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 就不支持)。