【问题标题】:TDS - receive userPasswordTDS - 接收用户密码
【发布时间】:2017-02-04 20:59:12
【问题描述】:

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

这种情况下的密码是: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...”是什么意思,我如何在这里获取密码?我必须对其进行编码吗?如果是,我该如何解决? 获取其他操作属性没问题。

最好的问候!

【问题讨论】:

  • 如果 LDAP 服务器配置正确,则不会。它应该对密码进行哈希处理,这是一个单向过程。如果你还没有配置你的服务器。请参阅 here 了解您应该这样做的原因。
  • 您的意思是,如果服务器配置正确,则无法接收密码,或者如果配置正确,我可以?是否可以通过“IBM Security Directory Server Web Administration Tool”进行配置?因为我真的需要提取密码并再次将它们导入另一个位置。
  • 如果 OpenLDAP 服务器配置正确,您将无法检索明文密码。当您的问题是关于 OpenLDAP 时,我不知道您为什么要谈论 IBM Security Directory Server Web Administration Tool。
  • 嗯,它不是 OpenLdap - 服务器,而是 TDS - 服务器。我正在使用“IBM Security Directory Server Web Administration Tool”作为 GUI。但是对于搜索或修改,我使用的是来自 openldap 的 ldapsearch 或 ldapmodify。
  • 那么为什么你的问题的标题和标签都是 OpenLDAP? 为什么你没有在问题中提到实际的服务器?和标签?

标签: java openldap tds


【解决方案1】:

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

【讨论】:

  • 你知道吗,我在哪里可以看到它是否配置了哈希(密码+盐)?也许我可以更改它以接收明文密码。
  • 它通常是一个配置选项,我对 OpenLDAP 配置不是很精通,但是,我认为您可以在 OpenLDAP 手册页/文档中找到配置选项
  • 好的,我在 TDS 中找到了该选项......并且在“管理安全属性/密码加密”中配置了 AES256 - 加密。但我不明白我可以用“ldapsearch -v -D cn=root -w xxxxxx -s sub uid=testuser userPassword”看到明文密码
  • 如果密码已加密且未经过散列处理,则原始形式的密码可用(经过散列处理后不可用)。我想既然您以 root 身份访问,您可能会看到解密后的密码,我想这将是 TDS 的一种行为。
【解决方案2】:

我发现了以下较早的问题LINK

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

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

【讨论】:

  • 不,它不会,一旦 HASH(PASSWORD+SALT) 你将在 pwd 字符串中得到这个值而不是原始用户密码
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2011-06-02
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2019-10-23
    相关资源
    最近更新 更多