2

我正在使用相当古老的大型 CMS(TeamSite),它有一个如何将其连接到 LDAP 服务器的示例。我已经阅读了这个例子,它以非常奇怪的方式工作。它只是按预期将密码存储在“userPassword”字段中,但它手动进行验证,而不是使用绑定命令。

这对我来说没有意义,但我在这里可能是错的,因为我以前没有使用过 LDAP 服务器。你知道为什么有人想手动比较密码而不是使用绑定吗?

代码如下所示:

  Attribute attrPassword = attrs.get("userPassword");
  if (attrPassword.size() > 0)
  {
    String storedPassword = new String((byte[])attrPassword.get(0));

    if (password.equals(storedPassword))
    {  
      ///.....
4

2 回答 2

6

这对我来说也没有意义。LDAP 中的密码不应该是实际密码本身,它应该是密码的哈希值。如果您检索该字段并进行比较,您需要知道它正在使用哪种散列,并以相同的方式对您自己比较的密码进行散列。它还要求userPasswordLDAP 中的属性可用于检索,我认为这不是必需的。

简而言之,不...我认为您应该使用绑定。

于 2010-10-26T16:18:57.010 回答
2

LDAP 支持密码比较,但与您的代码似乎正在执行的方式相反。

通常,客户端尝试比较,提供密码,LDAP 服务器进行比较,并返回 true 或 false。

您的代码看起来像是试图从 LDAP 读取密码,然后在其进程空间中进行比较。

这似乎不太可能适用于大多数 LDAP 服务器,除非散列方法是已知的并且storedPassword值是预先散列的。

您可能会考虑bind是否compare希望(或不希望)发生登录事件。登录事件可用于跟踪帐户活动。(例如,对于 PCI 合规性,您希望人们不会因为不活动而被停用,这将由登录决定)。

于 2010-10-26T16:25:34.220 回答