2010-04-14 17 views
3

是否有指定的哈希算法(MD5,SHA1等),用來存儲密碼,當您更新使用的Java API的代碼像這樣的開放式LDAP目錄的方式:如何通過Java更新LDAP時指定哈希算法?

private void resetPassword(String principal, String newPassword) throws NamingException { 
InitialDirContext ctxAdmin = null; 
    Hashtable<String, String> ctxData = new Hashtable<String, String>(); 
    ctxData.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    ctxData.put(Context.PROVIDER_URL, "ldap://myserver:389"); 
    ctxData.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    ctxData.put(Context.SECURITY_PRINCIPAL, "admin_dn"); 
    ctxData.put(Context.SECURITY_CREDENTIALS, "admin_passwd"); 
    InitialDirContext ctxAdmin = new InitialDirContext(ctxData); 
    if (newPassword == null || newPassword.equals("")) { 
     String msg = "Password can't be null"; 
     throw new NamingException(msg); 
    } else { 
     if (principal == null || principal.equals("")) { 
      String msg = "Principal can't be null"; 
      throw new NamingException(msg); 
     } else { 
     if (ctxAdmin == null) { 
      String errCtx = "Can't get LDAP context"; 
      throw new NamingException(errCtx); 
      } 
     } 
    } 
    BasicAttribute attr = new BasicAttribute("userpassword", newPassword); 
    ModificationItem modItem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr); 
    ModificationItem[] items = new ModificationItem[1]; 
    items[0] = modItem; 
    ctxAdmin.modifyAttributes("cn=" + principal + ",ou=Users,dc=com", items); 
} 

回答

5

東西沿着這些線路應該這樣做:(MD5)所示

context.setAttributeValue("userPassword", digestMd5("newPassword)); 

private String digestMd5(final String password) { 
    String base64; 
    try { 
    MessageDigest digest = MessageDigest.getInstance("MD5"); 
    digest.update(password.getBytes()); 
    base64 = new BASE64Encoder().encode(digest.digest()); 
    } 
    catch (NoSuchAlgorithmException e) { 
    throw new RuntimeException(e); 
    } 
    return "{MD5}" + base64; 
} 

-Jim