具有非明文密码的Java LDAP身份验证

时间:2013-09-08 16:24:10

标签: java security authentication ldap jndi

JNDI LDAP auth要求将明文密码传递给Context.SECURITY_CREDENTIALS几乎所有安全机制(或者至少我理解它)。它看起来像是以某种方式设计的,密码源自当前的JVM。但是,密码必须从另一台机器发送呢?这种方法迫使它以可恢复的方式发送(最简单的是明文),安全性很低。

更具体地说,让我们考虑一个3层设置:客户端,Java服务器和LDAP服务器。用户在发送到java服务器的客户端中输入用户名和密码。然后,Java服务器与LDAP服务器通信,以便授权这些凭据。有没有办法使从客户端到Java服务器的传输安全? 我理解,我们可以使用SSL或其他方式来保护频道本身,但我们必须通过这个(甚至是安全的)频道以可恢复的方式发送密码仍然不错。

我试图寻找答案,但看起来他们中的大多数都认为是2层设置。还有一些3d派对java库建议(而不是JNDI),但不清楚,如果它们可以处理我的任务。如果他们真的这样做了,你能举一个例子来利用它们来完成我的任务吗?

我的目标平台是Delphi XE3 Client,Java SE 6 Server和AD LDAP。但我也对更局限于这些具体客户端和LDAP的理论讨论感兴趣。

2 个答案:

答案 0 :(得分:1)

  

这种方法迫使它以可恢复的方式发送(最简单的是明文),安全性很低。

该方法要求您使用SSL。就这么简单。

答案 1 :(得分:1)

我们找到了答案并实际上使其适用于生产系统。 正确的路径是使用Kerberos协议http://en.wikipedia.org/wiki/Kerberos_(protocol)

在我的设置中,会发生以下情况:

1)客户端获取AD中服务器服务的票证并将其发送到服务器。这是通过TSSPIWinNTCredentialsIndy类附近的类完成的,但我认为很有可能直接使用Windows函数时没有遇到困难。

2)服务器作为服务登录到AD。这是通过LoginContext类使用正确的AppConfigurationEntry键来完成的。

3)服务器使用客户端票证验证AD中的客户端,获取客户端的用户名。这是通过Subject.doAs类和GSSManager类附近的类完成的。

4)服务器执行其他业务级别检查并授予客户端业务会话。这当然是针对特定业务的。

在这种情况下,不会进行任何不安全的通信,包括以可恢复的方式发送密码,因为这是Kerberos协议本身的设计目标。