TDS - 接收userPassword

时间:2016-09-27 09:32:02

标签: java openldap tds

是否可以通过java从ClearText中的TDS获取用户密码? 使用ldapsearch -v -D cn=root -w xxxxxx -s sub uid=testuser userPassword 我得到以下结果:

enter image description here

密码就是这样:Joko2014!

在Java中我尝试过:

String[] attrIDs = {".....",....,"userPassword"}
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrIDs);
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

NamingEnumeration<SearchResult> results = ctx.search(name,
                        filter, ctls);

while (results.hasMore()) {
    SearchResult entry = results.next();
    System.out.println(entry);
}

但控制台中的输出只是:

uid=testuser: null:null:{givenname=givenName: xxxx, sn=sn: xxx, pwdchangedtime=pwdChangedTime: 20160926173016.000000Z, mail=mail: xxxxxx@xx.xxx.com, uid=uid: testuser, userpassword;binary=userPassword;binary: [B@1a626f, pwdreset=pwdReset: true, cn=cn: xxxx, description=description: xxxxxx;xxxxxx;I;xxxxxx}

“binary = userPassword; binary:[B @ 1a626f ...”是什么意思,如何在这里获取密码?我必须编码吗?如果是,我该如何解决? 获得其他操作属性是没有问题的。

最诚挚的问候!

3 个答案:

答案 0 :(得分:0)

一旦进入配置了HASH(PASSWORD + SALT)密码存储的LDAP(userPassword属性的默认类型),就无法以明文形式检索原始密码。

答案 1 :(得分:0)

我发现了以前的问题LINK

这种方法是正确的还是可能的?因为它不起作用,因为似乎userPassword是&#34; null&#34; Attribute userPassword = entry.getAttributes().get("userPassword");

&#34;使用ldap,我们将获取字节数组中的数据。如果需要获取原始密码文本,请使用 以下代码:&#34; Attribute userPassword = attributes.get("userPassword"); String pwd = new String((byte[]) userPassword.get());

答案 2 :(得分:0)

我知道这感觉像是在做死刑,但最近我对TDS进行了一些研究,发现了一些对其他人可能有用的线索。 我不是Java开发人员,因为我不是开发人员,所以我无法为您提供帮助,但是我可以回答您有关ldapsearch如何返回明文userPassword属性的问题。

这是默认的TDS行为,默认情况下,它对加密的属性(例如userPassword)使用双向加密算法(默认为AES256),对这些属性的每次访问都会解密属性值并返回纯文本密码。 / p>

也许在您的Java应用程序中,您正在使用其他用户来查询TDS? 您可以使用cn = root临时检查。