我正在尝试使用DIGEST-MD5加密对我的LDAP服务器进行身份验证。使用简单加密时它可以正常工作,但由于显而易见的原因,我无法通过网络以纯文本形式发送密码。奇怪的是,在使用Softerra LDAP浏览器时,我可以使用Digest-MD5连接到服务器,但通过我的代码我收到一系列错误。
以下是我的LDAP身份验证类的代码片段,我在创建初始上下文之前尝试设置安全身份验证等。
Hashtable env = new Hashtable(11);
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
env.put(Context.PROVIDER_URL, ldapURI);
env.put(Context.INITIAL_CONTEXT_FACTORY, context);
env.put("com.sun.jndi.ldap.trace.ber", System.out);
try{
DirContext ctx = new InitialLdapContext(env,null);
} Catch (NamingException e){
e.printStackTrace();
}
答案 0 :(得分:4)
我的回答没有回答您的问题,而是纠正了一个误解:在BIND请求中使用SASL DIGEST-MD5机制要求目录服务器可以访问用户的密码。要使目录服务器能够访问密码,密码必须以明文形式存储或使用可逆密码方案加密。可逆密码方案本质上不如盐腌SHA散列安全,特别是具有长摘要的盐渍SHA-2散列。因此,使用带有DIGEST-MD5的SASL比使用安全连接上的简单BIND请求更不安全,其中安全连接是从头开始通过SSL加密的连接或非安全连接,促进与安全连接的安全连接StartTLS扩展操作,并且比SASL EXTERNAL机制或Kerberos安全性低。
误解是“通过网络以纯文本发送的密码”这一概念并不安全,实际上,使用salted SHA-2哈希将密码存储在目录服务器中(现代专业品质的目录服务器具有能够使用具有长摘要长度的盐渍SHA-2哈希)并通过安全连接传输明文密码比使目录服务器以明文或可逆加密方案存储密码更安全安全。因此,应避免使用DIGEST-MD5的SASL 。具有EXTERNAL机制的SASL,其中服务器从建立加密会话期间提供的证书中提取认证信息是更好的选择。 Kerberos也是一个更好的选择。如果服务器在使用salted SHA算法对其进行哈希处理之后存储密码,则网络上的纯文本也会更安全。
如果将SASL与DIGEST-MD5一起使用绝对至关重要,目录服务器应配置为使用最强的加密方案加密密码,除非我弄错,否则是AES。专业品质的服务器可以使用AES加密密码。