Md5 с кодировкой соли - PullRequest
       12

Md5 с кодировкой соли

1 голос
/ 09 февраля 2012

Я перенесу некоторые данные из системы CMS на основе Joomla в среду Java EE на основе Spring.

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

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

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

Фрагмент кода Junit: Этот тест не пройден.

@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 ?????

}

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Выше не работает (включая комментарий по запросу). Отсюда взят следующий код - 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();      
   }
}
0 голосов
/ 10 февраля 2012

Spring Md5PasswordEncoder никогда не претендовал на совместимость с солеными паролями Joomla MD5.

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

http://forum.joomla.org/viewtopic.php?t=207689#p993378 претендует на звание такого фрагмента кода, попробуйте его.

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

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

...