2013-12-11 1 views
0

Я пытаюсь преобразовать строку в его MD5 представления с этим кодом:преобразования строки в md5 дает добавить количество цифр

public static void main(String[] args) throws NoSuchAlgorithmException { 
     String s = "oshai"; 
     MessageDigest m = MessageDigest.getInstance("MD5"); 
     m.update(s.getBytes(),0,s.length()); 
     String md5 = new BigInteger(1,m.digest()).toString(16); 
     System.out.println(md5.length()); 
} 

возвращаемая строка имеет добавить количество цифр (31, так что это может быть Hex). Что я делаю не так?

+1

примечание: его, вероятно, 31 цифр, потому что его не проложенный. если бы хэш был маленьким числом, у него не было бы ведущих нулей. ответы ниже всех правильно помещают шестнадцатеричные числа. – slipperyseal

+1

Если сторонние библиотеки являются честной игрой, это намного проще (и более правильно) с [Guava] (https://code.google.com/p/guava-libraries/): 'Hashing.md5(). HashString (s, Charsets.UTF_8) .toString() 'возвращает корректный хэш-код MD5, закодированный в кодировке UTF-8. –

+0

Спасибо, я всегда предпочитаю, чтобы кто-то написал код, а Guava - один из моих фаворитов :-) – oshai

ответ

2

Вы не хотите использовать BigInteger. Попробуйте более традиционный метод toHexString ..

public static void main(String[] args) throws NoSuchAlgorithmException { 
     String s = "oshai"; 
     MessageDigest m = MessageDigest.getInstance("MD5"); 
     m.update(s.getBytes(),0,s.length()); 
     String string = toHexString(m.digest()); 
     System.out.println(string); 
} 

public static String toHexString(byte[] bytes) { 
    StringBuilder sb = new StringBuilder(); 
    for(byte b : bytes) { 
     sb.append(String.format("%02x", b)); 
    } 
    return sb.toString(); 
} 
+0

это из-за нулевого заполнения? – oshai

+0

Я просто ответил, что выше. я собираюсь угадать, да :) – slipperyseal

2

Этот метод работает точно:

private String hashWithMD5(String text) throws UnsupportedEncodingException, NoSuchAlgorithmException { 
    MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 
    byte[] digest = messageDigest.digest(text.getBytes("UTF-8")); 

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < digest.length; i++) { 
     sb.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1)); 
    } 

    return sb.toString(); 
} 
+0

Я проверил его, и кажется, что он заполняет число нулем. вы можете сказать почему? что правильно делать? – oshai

+0

Да, отступы ожидаются для значений, таких как хэши – slipperyseal

-2

использовать этот метод:

общественности статической строки md5 (String вход) {

String md5 = null; 

    if (null == input) 
     return null; 

    try { 

     // Create MessageDigest object for MD5 
     MessageDigest digest = MessageDigest.getInstance("MD5"); 

     // Update input string in message digest 
     digest.update(input.getBytes(), 0, input.length()); 

     // Converts message digest value in base 16 (hex) 
     md5 = new BigInteger(1, digest.digest()).toString(16); 

    } catch (NoSuchAlgorithmException e) { 

     e.printStackTrace(); 
    } 
    return md5; 
} 
+0

Какая разница с моим методом? – oshai

+0

этот метод работает, что разница; D – Bourkadi

+0

почему минус ?? спасибо – Bourkadi

0

я столкнулся ошибка с отсутствующими «00» на левой стороне, при преобразовании строки в зашифрованном формате.

Обычно вы не найдете ошибку в своем приложении, используя общий метод md5.

Итак, проверьте ваше приложение со строкой «sandeep» (я использовал его, потому что он имеет «00» на левой стороне).

Эта проблема испортила мне часы, и, наконец, я нашел следующее решение по ссылке.

«У меня была ошибка с md5 строки с 00 по LeftSide, то есть строка„Сандип“преобразуется в „DCF16D903E5890AABA465B0B1BA51F“, чем собственно«00DCF16D903E5890AABA465B0B1BA51F

Я закончил с этим методом, которые работают круто в моем приложении ".

public static String md5(String inputString) { 
    try { 
     // Create MD5 Hash 
     MessageDigest msgDigest = java.security.MessageDigest.getInstance("MD5"); 
     msgDigest.update(inputString.getBytes()); 
     byte msgDigestBytes[] = msgDigest.digest(); 

     // Create Hex String 
     StringBuffer hexString = new StringBuffer(); 
     for (int i = 0; i < msgDigestBytes.length; i++) { 
      String h = Integer.toHexString(0xFF & msgDigestBytes[i]); 
      while (h.length() < 2) 
       h = "0" + h; 
      hexString.append(h); 
     } 
     return hexString.toString(); 

    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    return ""; 
} 

Ref: http://www.coderexception.com/CbHuB1uHPWxXUQXi/converting-string-to-md5-gives-add-number-of-digits