2

私はかなり古くて大きな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))
    {  
      ///.....
4

2 に答える 2

6

それも私には意味がありません。LDAP内のパスワードは、実際のパスワード自体ではなく、パスワードのハッシュである必要があります。フィールドを取得して比較する場合は、使用しているハッシュの種類を把握し、同じ方法で比較しているパスワードをハッシュする必要があります。またuserPassword、LDAPの属性を取得できるようにする必要がありますが、これは必要ではないと思います。

要するに、いいえ...バインドを使用する必要があると思います。

于 2010-10-26T16:18:57.010 に答える
2

LDAPはパスワードの比較をサポートしていますが、コードがそれを行っているように見える方法とは逆になっています。

通常、クライアントは比較を試み、パスワードを提供し、LDAPサーバーは比較を実行し、trueまたはfalseを返します。

コードは、LDAPからパスワードを読み取ろうとしているように見え、プロセススペースで比較を実行します。

storedPasswordこれは、ハッシュ方法がわかっていて値が事前にハッシュされていない限り、ほとんどのLDAPサーバーで機能する可能性は低いようです。

ログインイベントを発生させたい(または発生させたくない)場合とbind比較することを検討してください。compareログインイベントは、アカウントアクティビティを追跡するのに役立ちます。(たとえば、PCIコンプライアンスの場合、ログインによって決定される非アクティブが原因でユーザーが非アクティブ化されないようにする必要があります)。

于 2010-10-26T16:25:34.220 に答える