Changeset 977cdee


Ignore:
Timestamp:
Oct 15, 2012 12:28:45 PM (8 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
50cb4273
Parents:
ba37839
Message:
  • Move MD5 functions to core util where i2ptunnel can use them
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHandler.java

    rba37839 r977cdee  
    7171        ConsolePasswordManager mgr = new ConsolePasswordManager(_context);
    7272        // rfc 2617
    73         pw = name + ':' + RouterConsoleRunner.JETTY_REALM + ':' + pw;
    74         if (mgr.saveMD5(RouterConsoleRunner.PROP_CONSOLE_PW, name, pw)) {
     73        if (mgr.saveMD5(RouterConsoleRunner.PROP_CONSOLE_PW, RouterConsoleRunner.JETTY_REALM, name, pw)) {
    7574            addFormNotice(_("Added user {0}", name));
    7675            addFormNotice(_("Restart required to take effect"));
  • apps/routerconsole/java/src/net/i2p/router/web/ConsolePasswordManager.java

    rba37839 r977cdee  
    11package net.i2p.router.web;
    22
    3 import java.io.UnsupportedEncodingException;
    4 import java.security.MessageDigest;
    5 import java.security.NoSuchAlgorithmException;
    63import java.util.ArrayList;
    74import java.util.Collections;
     
    3734   
    3835    /**
    39      *  Checks both plaintext and hash
    40      *
    41      *  @param realm e.g. i2cp, routerconsole, etc.
    42      *  @param user null or "" for no user, already trimmed
    43      *  @param pw plain text, already trimmed
    44      *  @return if pw verified
    45      */
    46     public boolean check(String realm, String user, String pw) {
    47         return super.check(realm, user, pw) ||
    48                //checkCrypt(realm, user, pw) ||
    49                checkMD5(realm, user, pw);
    50     }
    51 
    52     /**
    5336     *  The username is the salt
    5437     *
     
    7861     *  @return if pw verified
    7962     */
    80     public boolean checkMD5(String realm, String user, String pw) {
     63    public boolean checkMD5(String realm, String subrealm, String user, String pw) {
    8164        String pfx = realm;
    8265        if (user != null && user.length() > 0)
     
    8568        if (hex == null)
    8669            return false;
    87         try {
    88             MessageDigest md = MessageDigest.getInstance("MD5");
    89             md.update(pw.getBytes("ISO-8859-1"));
    90             // must use the method that adds leading zeros
    91             return hex.equals(DataHelper.toString(md.digest()));
    92         } catch (UnsupportedEncodingException uee) {
    93             return false;
    94         } catch (NoSuchAlgorithmException nsae) {
    95             return false;
    96         }
     70        return hex.equals(md5Hex(subrealm, user, pw));
    9771    }
    9872   
     
    133107            if (pw != null) {
    134108                if (pw.length() > 0) {
    135                     pw = CONSOLE_USER + ':' + RouterConsoleRunner.JETTY_REALM + ':' + pw;
    136                     saveMD5(RouterConsoleRunner.PROP_CONSOLE_PW, CONSOLE_USER, pw);
     109                    saveMD5(RouterConsoleRunner.PROP_CONSOLE_PW, RouterConsoleRunner.JETTY_REALM,
     110                            CONSOLE_USER, pw);
    137111                }
    138112                Map toAdd = Collections.singletonMap(PROP_MIGRATED, "true");
     
    173147    /**
    174148     *  Straight MD5, no salt
     149     *  Compatible with Jetty and RFC 2617.
    175150     *
    176151     *  @param realm The full realm, e.g. routerconsole.auth.i2prouter, etc.
    177      *  @param user null or "" for no user, already trimmed
    178      *  @param pw plain text, must be of the form user:realm:pw to be compatible with Jetty
     152     *  @param subrealm to be used in creating the checksum
     153     *  @param user non-null, non-empty, already trimmed
     154     *  @param pw plain text
    179155     *  @return if pw verified
    180156     */
    181     public boolean saveMD5(String realm, String user, String pw) {
    182         String pfx = realm;
    183         if (user != null && user.length() > 0)
    184             pfx += '.' + user;
    185         try {
    186             MessageDigest md = MessageDigest.getInstance("MD5");
    187             md.update(pw.getBytes("ISO-8859-1"));
    188             String hex = DataHelper.toString(md.digest());
    189             Map<String, String> toAdd = Collections.singletonMap(pfx + PROP_MD5, hex);
    190             List<String> toDel = new ArrayList(4);
    191             toDel.add(pfx + PROP_PW);
    192             toDel.add(pfx + PROP_B64);
    193             toDel.add(pfx + PROP_CRYPT);
    194             toDel.add(pfx + PROP_SHASH);
    195             return _context.router().saveConfig(toAdd, toDel);
    196         } catch (UnsupportedEncodingException uee) {
     157    public boolean saveMD5(String realm, String subrealm, String user, String pw) {
     158        String pfx = realm;
     159        if (user != null && user.length() > 0)
     160            pfx += '.' + user;
     161        String hex = md5Hex(subrealm, user, pw);
     162        if (hex == null)
    197163            return false;
    198         } catch (NoSuchAlgorithmException nsae) {
    199             return false;
    200         }
     164        Map<String, String> toAdd = Collections.singletonMap(pfx + PROP_MD5, hex);
     165        List<String> toDel = new ArrayList(4);
     166        toDel.add(pfx + PROP_PW);
     167        toDel.add(pfx + PROP_B64);
     168        toDel.add(pfx + PROP_CRYPT);
     169        toDel.add(pfx + PROP_SHASH);
     170        return _context.router().saveConfig(toAdd, toDel);
    201171    }
    202172   
     
    222192
    223193        System.out.println("Test MD5");
    224         if (!pm.saveMD5("type3", "user3", "pw3"))
     194        if (!pm.saveMD5("type3", "realm", "user3", "pw3"))
    225195            System.out.println("Fail 6");
    226         if (!pm.checkMD5("type3", "user3", "pw3"))
     196        if (!pm.checkMD5("type3", "realm", "user3", "pw3"))
    227197            System.out.println("Fail 7");
    228198
  • core/java/src/net/i2p/util/PasswordManager.java

    rba37839 r977cdee  
    11package net.i2p.util;
     2
     3import java.io.UnsupportedEncodingException;
     4import java.security.MessageDigest;
     5import java.security.NoSuchAlgorithmException;
    26
    37import net.i2p.I2PAppContext;
     
    145149        return Base64.decodeToString(b64);
    146150    }
     151
     152    /**
     153     *  Straight MD5, no salt
     154     *  Will return the MD5 sum of "user:subrealm:pw", compatible with Jetty
     155     *  and RFC 2617.
     156     *
     157     *  @param subrealm to be used in creating the checksum
     158     *  @param user non-null, non-empty, already trimmed
     159     *  @param pw non-null, plain text, already trimmed
     160     *  @return lower-case hex with leading zeros, 32 chars, or null on error
     161     */
     162    public static String md5Hex(String subrealm, String user, String pw) {
     163        String fullpw = user + ':' + subrealm + ':' + pw;
     164        try {
     165            MessageDigest md = MessageDigest.getInstance("MD5");
     166            md.update(fullpw.getBytes("ISO-8859-1"));
     167            // adds leading zeros if necessary
     168            return DataHelper.toString(md.digest());
     169        } catch (UnsupportedEncodingException uee) {
     170        } catch (NoSuchAlgorithmException nsae) {
     171        }
     172        return null;
     173    }
    147174}
Note: See TracChangeset for help on using the changeset viewer.