2010-12-09 58 views
2

Je peux lire le mot de passe stocké dans LDAP via JNDI. Mais le résultat est des caractères charabia. Alors, comment puis-je le décrypter?Comment récupérer le mot de passe LDAP via JNDI

Ci-dessous mon 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] 

Tous les conseils ?? Un grand merci à l'avance

Kevin

+1

Quel est exactement le but de récupérer le mot de passe? Cela viole les pratiques de sécurité de base. – EJP

Répondre

7

Qu'est-ce que vous voyez ([B @ 1cd8669) est la manière de Java de dire « ceci est un tableau d'octets ».

Le "mot de passe" stocké est très probablement un hachage du mot de passe réel ou une version cryptée. Les hachages cryptographiques sont, par définition, non réversibles, de sorte que vous ne pourrez pas voir le mot de passe de l'utilisateur si LDAP stocke le hachage.

Si c'est crypté, si vous connaissez l'algorithme et la clé, il est assez simple à déchiffrer. BouncyCastle est une excellente bibliothèque de chiffrement Java que vous pouvez utiliser pour déchiffrer le mot de passe.

Fondamentalement, vous devez savoir exactement ce que vous regardez, et cela dépendra de la configuration de LDAP.

1

avec ldap nous obtenir des données de l'octet array.if vous devez obtenir le texte de mot de passe d'origine, utilisez le code suivant
:

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