2010-12-09 8 views
2

Ich kann das in LDAP gespeicherte Passwort über JNDI lesen. Aber das Ergebnis sind einige Kauderwelsch-Charaktere. Wie entschlüssele ich es?So rufen Sie das LDAP-Passwort über JNDI ab

Unten ist mein Code:

public static void main(String[] args) 
     { 
      String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory"; 
      String MY_HOST = "ldap://KhooGP-Comp1:1389"; 
      String MGR_DN = "cn=Directory Manager"; 
      String MGR_PW = "password"; 
      String MY_SEARCHBASE = "dc=QuizPortal"; 
      String MY_FILTER = "uid=yiwei"; 
      String MY_ATTRS[] = {"cn", "uid", "sn", "userpassword"}; 

      //Identify service provider to use 
      Hashtable env = new Hashtable(); 
      env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX); 
      env.put(Context.PROVIDER_URL, MY_HOST); 

      env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
      env.put(Context.SECURITY_PRINCIPAL, MGR_DN); 
      env.put(Context.SECURITY_CREDENTIALS, MGR_PW); 

      try 
      { 
       // Create the initial directory context 
       InitialDirContext initialContext = new InitialDirContext(env); 
       DirContext ctx = (DirContext)initialContext; 

       System.out.println("Context Sucessfully Initialized"); 

       SearchControls constraints = new SearchControls(); 
       constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 

       NamingEnumeration results = ctx.search(MY_SEARCHBASE, MY_FILTER, constraints); 

       while(results != null && results.hasMore()) 
       { 
        SearchResult sr = (SearchResult) results.next(); 
        String dn = sr.getName() + "," + MY_SEARCHBASE; 
        System.out.println("Distinguished Name is " + dn); 

        Attributes ar = ctx.getAttributes(dn, MY_ATTRS); 

        if(ar == null) 
        { 
         System.out.println("Entry " + dn); 
         System.out.println(" has none of the specified attributes\n"); 
        } 
        else 
        { 
         for(int i=0; i<MY_ATTRS.length; i++) 
         { 
          Attribute attr = ar.get(MY_ATTRS[i]); 
          System.out.println(MY_ATTRS[i] + ":"); 

          for(Enumeration vals=attr.getAll(); vals.hasMoreElements();) 
          { 
           System.out.println("\t" + vals.nextElement()); 
          } 
         } 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       System.err.println(e); 
      } 
    } 

Below is the result: 

    Distinguished Name is uid=yiwei,ou=Administrator,o=SID,dc=QuizPortal 
    cn: 
      yiwei huang 
    uid: 
      yiwei 
    sn: 
      huang 
    userpassword: 
      [[email protected] 

Jede Beratung ?? Vielen Dank im Voraus

Kevin

+1

Was genau ist der Zweck das Passwort des Abrufens? Dies verletzt grundlegende Sicherheitsmaßnahmen. – EJP

Antwort

7

Was Sie sehen ([B @ 1cd8669) ist der Weg der Java zu sagen: "Das ist ein Byte-Array".

Das gespeicherte "Passwort" ist höchstwahrscheinlich entweder ein Hash des echten Passworts oder eine verschlüsselte Version. Kryptografische Hashes sind definitionsgemäß nicht reversibel, sodass Sie nicht sehen können, welches Passwort das Benutzer hat, wenn LDAP den Hash speichert.

Wenn es verschlüsselt ist, dann ist es ziemlich einfach zu entschlüsseln, wenn Sie den Algorithmus und den Schlüssel kennen. ist eine großartige Java Crypto Library, mit der Sie das Passwort entschlüsseln können.

Grundsätzlich müssen Sie genau wissen, was Sie sehen, und das hängt von der LDAP-Einrichtung ab.

1

mit ldap werden wir Daten in Byte erhalten array.if Sie das Original-Passwort Text erhalten müssen die
folgenden Code verwenden:

Attribute userPassword = attributes.get("userPassword"); 
String pwd = new String((byte[]) userPassword.get()); 
Verwandte Themen