Может кто-нибудь объяснить, как работает этот код MD5 MessageDigest?

Я изучаю MD5, а также SHA с MessageDigest. Вот код, который у меня есть из класса, который реализует MD5 с MessageDigest. У меня проблемы с пониманием.

Таким образом, он получает «экземпляр» MD5. Я предполагаю, что это алгоритм MD5? Затем он обновляет байты. Почему это происходит? Затем он создает переменную bytes b с помощью md.digest(), но я тоже не уверен, почему он это делает? Затем я думаю, что он использует оператор for для выполнения алгоритма и, возможно, дополняет его (добавляет 0?). Если бы кто-нибудь мог объяснить немного лучше, я был бы признателен!

   try {
                MessageDigest md = MessageDigest.getInstance("MD5"); // get the
                                                                        // instance
                                                                        // of md5
            md.update(bytes); // get the digest updated
            byte[] b = md.digest(); // calculate the final value
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            message = buf.toString(); // output as strings

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace(); // when certain algorithm is down, output the
                                    // abnormal condition
        }
        return message;
    }

person RockOn    schedule 18.04.2016    source источник


Ответы (1)


md.update(bytes) просто пропускает байты через MD5. byte[] b = md.digest() выводит результат хеша MD5 в виде последовательности байтов.

Тогда весь остальной код представляет собой ужасно неудобный способ преобразования байтов в шестнадцатеричную строку.

person Louis Wasserman    schedule 18.04.2016
comment
Не могли бы вы объяснить лучший способ преобразования байтов в шестнадцатеричный формат? - person RockOn; 18.04.2016
comment
stackoverflow.com/questions/9655181/ - person Andy Turner; 18.04.2016
comment
Я имею в виду, я бы использовал BaseEncoding.base16().lowerCase().encode(bytes) Гуавы. - person Louis Wasserman; 18.04.2016
comment
Или я бы переписал все это с помощью гуавы с одной строкой Hashing.md5().hashBytes(bytes).toString(). - person Louis Wasserman; 19.04.2016