2012-02-09 3 views
1

Я переношу некоторые данные из системы cms на основе joomla в среду Java EE на основе Spring.Md5 с кодированием соли

Во время анализа я обнаружил, что реализация md5 паролей не такая же, как joomla ??? Любая идея, почему разница в реализации md5?

Например: если Joomla запись имела поле пароля, как «3c57ebfec712312f30c3fd1981979f58:WnvTroeiBmd5bjGmmsVUnNjppadH7giK» (здесь 3c57ebfec712312f30c3fd1981979f58 является окончательным md5 хэш-дайджеста и WnvTroeiBmd5bjGmmsVUnNjppadH7giK является ключом, который будет добавлен с вводом пароля пользователя) и когда пользователь пытается войти в систему с этой записью в пружинная система не работает.

В весенней системе Java EE мы используем хеш-кодировщик как md5 и соль как некоторую переменную, которая здесь WnvTroeiBmd5bjGmmsVUnNjppadH7giK.

Сводный код юнита: Этот тест не подходит.

@Test 
public void testSpringMD5Functionality() { 

    String md5MigratedPassword = "3c57ebfec712312f30c3fd1981979f58:WnvTroeiBmd5bjGmmsVUnNjppadH7giK"; 
    String[] m = md5MigratedPassword.split(":"); 

    Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder(); 
    passwordEncoder.setEncodeHashAsBase64(false); 
    boolean value = passwordEncoder.isPasswordValid(m[0], "password", m[1]); 
    assertTrue(value); //test case fails ????? 

} 

ответ

0

в Spring Md5PasswordEncoder никогда не утверждал, чтобы быть совместимым с солеными паролей MD5 в Joomla.

Короче говоря, он не может работать. Вам нужен код Java, делающий то же самое, что и Joomla.

http://forum.joomla.org/viewtopic.php?t=207689#p993378 претендует на то, чтобы быть такой частью кода, вы должны попробовать.

Если это не работает, то виновником ошибки может быть проблема с кодировкой, вы должны обязательно преобразовать строку Java (16-разрядные символы) в представление, совместимое с PHP.

Также вам следует рассмотреть путь перехода к более сильной функции деривации пароля, такой как PBKDF2.

+0

Это заняло у меня почти день, чтобы исправить this.Below тестовый пример работает @test общественного недействительными testSpringMD5Functionality() { Строка md5MigratedPassword = "3c57ebfec712312f30c3fd1981979f58: WnvTroeiBmd5bjGmmsVUnNjppadH7giK"; Строка [] m = md5MigratedPassword.split (":"); Md5PasswordEncoder passwordEncoder = новый Md5PasswordEncoder(); passwordEncoder.setEncodeHashAsBase64 (false); boolean value = passwordEncoder.isPasswordValid (m [0] + m [1], "password", null); assertTrue (значение); // пропуска для испытаний } – challenge

2

Вышеуказанное не работает (включая комментарий по вызову). Следующий код взят отсюда - http://forum.joomla.org/viewtopic.php?t=207689#p993378 и подтверждено, что он работает как для соленых, так и для несолированных паролей.

public class Joomla15PasswordHash 
{ 
    public static boolean check(String passwd,String dbEntry) { 
     if (passwd==null || dbEntry==null || dbEntry.length()==0) 
    throw new IllegalArgumentException(); 
     String[] arr = dbEntry.split(":",2); 
     if (arr.length==2) { 
    // new format as {HASH}:{SALT} 
    String cryptpass = arr[0]; 
    String salt = arr[1]; 

    return md5(passwd+salt).equals(cryptpass); 
     } else { 
     // old format as {HASH} just like PHPbb and many other apps 
    String cryptpass = dbEntry; 

    return md5(passwd).equals(cryptpass); 
     } 
    } 

    static Random _rnd; 

    public static String create(String passwd) { 
     StringBuffer saltBuf = new StringBuffer(); 
     synchronized (Joomla15PasswordHash.class) { 
    if (_rnd==null) _rnd=new SecureRandom(); 
    int i; 
    for (i=0;i<32;i++) { 
     saltBuf.append(Integer.toString(_rnd.nextInt(36),36)); 
    } 
     } 
     String salt = saltBuf.toString(); 

     return md5(passwd+salt)+":"+salt; 
    } 

    /** Takes the MD5 hash of a sequence of ASCII or LATIN1 characters, 
    * and returns it as a 32-character lowercase hex string. 
    * 
    * Equivalent to MySQL's MD5() function 
    * and to perl's Digest::MD5::md5_hex(), 
    * and to PHP's md5(). 
    * 
    * Does no error-checking of the input, but only uses the low 8 bits 
    * from each input character. 
    */ 
    private static String md5(String data) { 
     byte[] bdata = new byte[data.length()]; int i; byte[] hash; 

     for (i=0;i<data.length();i++) bdata[i]=(byte)(data.charAt(i)&0xff); 

     try { 
     MessageDigest md5er = MessageDigest.getInstance("MD5"); 
     hash = md5er.digest(bdata); 
     } catch (GeneralSecurityException e) { throw new RuntimeException(e); } 

     StringBuffer r = new StringBuffer(32); 
     for (i=0;i<hash.length;i++) { 
     String x = Integer.toHexString(hash[i]&0xff); 
     if (x.length()<2) r.append("0"); 
     r.append(x); 
     } 
     return r.toString();  
    } 
} 
Смежные вопросы