2013-03-10 2 views
1

Я пытаюсь преобразовать две строки из списка строк в MD5 дайджесты сообщений.MD5 Message Digest Java

Мой список строк называется «usernamepassword».

try { 
      MessageDigest mdg = MessageDigest.getInstance("MD5");  

      mdg.update(usernamepassword.get(0).getBytes(), 0, usernamepassword.get(0).length()); 
      mdg.update(usernamepassword.get(1).getBytes(), 1, usernamepassword.get(0).length());  


     } catch (NoSuchAlgorithmException ex) { 
      Logger.getLogger(UPCheck.class.getName()).log(Level.SEVERE, null, ex); 
     } 

Мой вопрос -

A: Это правильный способ сделать это? B: Как я могу вернуть его, чтобы я мог использовать каждый отдельный хэш MD5 в другом классе?

+0

Вы должны использовать bcrypt или scrypt или PBKDFv2. – SLaks

ответ

4

A: Это правильный способ сделать это?

Нет, четыре причины:

1) Вы используете кодировку символов по умолчанию, вместо того, чтобы указать конкретную кодировку. Я бы рекомендовал использовать UTF-8.

2) Вы используете длину строки в символов, чтобы определить, сколько байтов использовать

3) Если вы хотите, отдельные дайджесты (по одному на каждой строке), то вы должны использовать отдельные MessageDigest для каждого из них, или позвонить reset между звонками

4) На данный момент вы ничего не делаете с дайджестами.

Я предлагаю вам извлечь «MD5 строки в определенной кодировке» в отдельный метод:

public static byte[] getMd5OfUtf8(String text) { 
    try { 
     MessageDigest digest = MessageDigest.getInstance("MD5");  
     return digest.digest(text.getBytes("UTF-8")); 
    } catch (NoSuchAlgorithmException ex) { 
     throw new RuntimeException("No MD5 implementation? Really?"); 
    } catch (UnsupportedEncodingException ex) { 
     throw new RuntimeException("No UTF-8 encoding? Really?"); 
    } 
} 

Тогда вы можете назвать это для каждого из элементов списка вы заинтересованы в - это не ясно, что вы пытаетесь сделать do с последующими дайджестами, но вы, вероятно, захотите их отдельно ...

EDIT: Как отмечено в комментариях, MD5 действительно не является отличным выбором в эти дни. Что-то вроде SHA-256 с солью было бы лучше, но для реальных защищенных приложений вы, вероятно, должны прочитать некоторую современную литературу по этой теме. (Я не эксперт, поэтому не хочу звучать слишком авторитетно.)

+1

5) Вы используете MD5, алгоритм с известными уязвимостями, короткий быстрый вывод и отсутствие соли, для паролей – SLaks

+0

Спасибо @JonSkeet - прочитает в нем больше. Я последовал за несколькими видео Youtube, но они, похоже, сбились с пути. –

+0

@SLaks. Поскольку программа не будет опубликована, я не слишком беспокоюсь, какой метод шифрования я использую. Но спасибо за головы! –

1

Используйте класс DigestUtils из сообщества apache. Несколько методов утилиты помогут вам вычислить/отобразить md5 или некоторые другие общие хэш-функции.