文档

Java™ 教程
隐藏目录
Digest-MD5
追踪:Java命名和目录接口
教训:LDAP用户的高级主题
部分:安全

摘要-MD5

Digest-MD5认证是LDAP v3服务器所必需的认证机制( RFC 2829)。因为使用SASL是LDAP v3的一部分( RFC 2251),仅支持LDAP v2的服务器不支持Digest-MD5。

Digest-MD5机制在RFC 2831中有描述。它基于HTTP摘要认证( RFC 2251)。在Digest-MD5中,LDAP服务器发送包含各种认证选项的数据,它愿意支持加上一个特殊的令牌给LDAP客户端。客户端通过发送加密的响应来指示它选择的认证选项。响应被加密的方式能够证明客户端知道它的密码。然后LDAP服务器解密并验证客户端的响应。

要使用Digest-MD5认证机制,您必须设置以下认证环境属性。

Context.SECURITY_AUTHENTICATION
设置为字符串"DIGEST-MD5"
Context.SECURITY_PRINCIPAL
设置为主体名称。这是一个特定于服务器的格式。一些服务器支持登录用户ID格式,比如在UNIX或Windows登录屏幕上定义的格式。其他服务器接受一个可分辨的名称。还有一些使用RFC 2829中定义的授权ID格式。在该RFC中,名称应该是字符串"dn:",后面跟上正在进行身份验证的实体的完全限定DN,或者是字符串"u:",后面跟上用户ID。一些服务器接受多种格式。一些格式的示例是"cuser""dn: cn=C. User, ou=NewHires, o=JNDITutorial""u: cuser"此属性的数据类型必须是java.lang.String
Context.SECURITY_CREDENTIALS
设置为主体的密码(例如"mysecret")。它的类型可以是java.lang.Stringchar数组(char[])或byte数组(byte[])。如果密码是java.lang.Stringchar[],则使用UTF-8进行编码以传输到服务器。如果密码是byte[],则按原样传输到服务器。

下面的示例展示了客户端如何使用Digest-MD5对LDAP服务器进行身份验证。

// 设置用于创建初始上下文的环境
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");

// 使用C. User和密码"mysecret"进行身份验证
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, 
        "dn:cn=C. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");

// 创建初始上下文
DirContext ctx = new InitialDirContext(env);

// ... 使用ctx进行一些有用的操作

注意: Oracle Directory Server, v5.2支持使用Digest-MD5机制对具有明文密码的用户进行身份验证。您必须在创建用户之前设置密码加密模式。如果您已经创建了用户,请删除并重新创建。要使用管理控制台设置密码加密模式,请选择配置选项卡和数据节点。在密码窗格中,为"Password encryption"选项选择"No encryption (CLEAR)"。服务器接受简单用户名(即具有一个uid属性值的条目)和用户名称的"dn:"格式。有关详细信息,请参阅服务器的文档。

指定领域

一个领域定义了身份验证实体(Context.SECURITY_PRINCIPAL属性的值)被选中的命名空间。一个服务器可能有多个领域。例如,一个大学的服务器可以配置为有两个领域,一个用于学生用户,另一个用于教师用户。领域配置由目录管理员完成。一些目录具有默认的单个领域。例如,Oracle Directory Server, v5.2使用机器的完全限定主机名作为默认领域。

在Digest-MD5身份验证中,您必须对一个特定的领域进行身份验证。您可以使用以下身份验证环境属性来指定领域。如果您没有指定领域,则将使用服务器提供的任何一个领域。

java.naming.security.sasl.realm
设置为主体的领域。这是一个特定于部署和/或特定于服务器的区分大小写的字符串。它标识了应该选择主体名称(Context.SECURITY_PRINCIPAL)的领域或域。如果该领域与服务器提供的领域之一不匹配,则身份验证失败。

下面的示例展示了如何设置环境属性以使用Digest-MD5进行身份验证并指定域。为了使这个示例在您的环境中工作,您必须更改源代码,以使域值反映您在目录服务器上配置的内容。

// 在域“JNDITutorial”中以C. User和密码“mysecret”进行身份验证
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, 
        "dn:cn=C. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");
env.put("java.naming.security.sasl.realm", "JNDITutorial");

如果您需要使用隐私保护和其他SASL属性,请参考JNDI教程。


上一页: SASL
下一页: SSL 和自定义套接字