Как восстановить пароль LDAP через JNDI - PullRequest
3 голосов
/ 09 декабря 2010

Я могу прочитать пароль, хранящийся в LDAP, через JNDI. Но в результате получаются некоторые бессмысленные персонажи. Так как мне расшифровать это?

Ниже мой код:

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:
            [B@1cd8669

Любой совет? Большое спасибо заранее

Кевин

Ответы [ 2 ]

9 голосов
/ 09 декабря 2010

То, что вы видите ([B @ 1cd8669), - это способ Java сказать «это байтовый массив».

Хранимый «пароль», скорее всего, является либо хэшем реального пароля, либозашифрованная версия.Криптографические хеши по определению необратимы, поэтому вы не сможете увидеть, какой пароль у пользователя, если LDAP хранит хеш.

Если он зашифрован, то если вы знаете алгоритм и ключ, это довольно просто.расшифровать. BouncyCastle - это отличная криптографическая библиотека Java, которую можно использовать для расшифровки пароля.

По сути, вам необходимо точно знать, на что вы смотрите, и это будет зависеть от настройки LDAP.

2 голосов
/ 25 ноября 2014

с помощью ldap мы получим данные в байтовом массиве. Если вам нужно получить исходный текст пароля, используйте
следующий код:

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