Java 使用String.equals比较密码并根据LDAP服务器对用户进行身份验证,这有什么意义吗?

Java 使用String.equals比较密码并根据LDAP服务器对用户进行身份验证,这有什么意义吗?,java,ldap,teamsite,Java,Ldap,Teamsite,我正在使用非常旧的大型CMS(TeamSite),它有一个如何将其连接到LDAP服务器的示例。我读过这个例子,它的工作方式非常奇怪。 它只是像预期的那样在“userPassword”字段中存储密码,但它手动执行验证,而不是使用bind命令 这对我来说没有意义,但我可能错了,因为我以前没有使用过LDAP服务器。你知道为什么有人想手动比较密码而不是使用bind吗 下面是代码的外观: Attribute attrPassword = attrs.get("userPassword"); if

我正在使用非常旧的大型CMS(TeamSite),它有一个如何将其连接到LDAP服务器的示例。我读过这个例子,它的工作方式非常奇怪。 它只是像预期的那样在“userPassword”字段中存储密码,但它手动执行验证,而不是使用bind命令

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

下面是代码的外观:

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

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

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


简言之,没有。。。我认为您应该使用bind。

LDAP支持对密码进行比较,但与您的代码进行比较的方式相反

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

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

这似乎不太可能适用于大多数LDAP服务器,除非知道散列方法并且预先设置了
storedPassword


<>您可能会考虑<代码>绑定<代码> VS <代码>比较< /代码>,如果您想要(或不希望)登录事件发生。登录事件有助于跟踪帐户活动。(例如,对于PCI合规性,您希望人员不会因不活动而被停用,这将由登录决定)。

附议。我想补充一点,一些LDAP实现不允许对
userPassword
进行读取访问,只允许您在查询中使用它。这就解释了为什么我在另一个例子中看到了关于纯文本密码的“comment”字段中存储的密码:)。我在评论中发现JavaScript在提交表单之前会对密码进行SHA1摘要。你能解释一下如何在服务器上对密码进行比较吗?如果我尝试将实际密码字符串与userPassword字段中的内容进行比较,则返回false;为了让它返回true,据我所知,我需要将整个“{ssha}stuff/otherstuff”字符串传递给它,这需要客户端完成哈希/编码。