Целостность информации

Представь ситуацию, ты выкачал архив с интернета, и в момент скачивания у тебя на несколько секунд пропало соединение.

Нужно убедиться, валидный ли архив ты скачал. Для этого сверим его MD5 хеш.

Прочитать о MD5 на wiki. Прочитать о MessageDigest.

Реализуй логику метода compareMD5, который должен получать MD5 хеш из переданного ByteArrayOutputStream и сравнивать с эталонным MD5 переданным вторым параметром.

Метод main не участвует в тестировании.

Требования:

1. Класс Solution должен содержать метод compareMD5(ByteArrayOutputStream byteArrayOutputStream, String md5).

2. Метод compareMD5(ByteArrayOutputStream byteArrayOutputStream, String md5) должен использовать MessageDigest.

3. Метод compareMD5(ByteArrayOutputStream byteArrayOutputStream, String md5) должен возвращать результат сравнения вычисленного MD5 хеша для byteArrayOutputStream с переданным параметром md5.

4. Класс Solution должен содержать метод main.

public class Solution {
    public static void main(String... args) throws Exception {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(new String("test string"));
        oos.flush();
        System.out.println(compareMD5(bos, "6f8db599de986fab7a21625b7916589c")); //true

    }

    public static boolean compareMD5(ByteArrayOutputStream byteArrayOutputStream, String md5) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] stream = md.digest(byteArrayOutputStream.toByteArray());

        StringBuilder sb = new StringBuilder();
        for (byte b : stream)
            sb.append(String.format("%02x", b));

        //BigInteger i = new BigInteger(1, stream);
        //return String.format("%032x", i).equals(md5);
        return md5.equals(sb.toString());
    }
}

Валидатор принимает закомментированное (не мое) решение. Однако, мое решение выдает ровно тот же хэш. В то же время правильный хэш предложенной в main тестовой строки совсем другой, о чем нам и говорят составители задачи в строке

> System.out.println(compareMD5(bos, "6f8db599de986fab7a21625b7916589c")); //true

Сравнение вычисленного хэша тестовой строки любым из двух предложенных решений выдает false, при этом задача (закомментированные строки) принимается валидатором. Так что же мы вычисляем в методе compareMD5?

задан 16 Янв, 09:24

%D0%9C%D0%B8%D1%88%D0%B0_%D0%A7's gravatar image

Миша_Ч
357
одобрено: 100%

Ваш ответ будет первым!
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×144

Задан: 16 Янв, 09:24

Просмотров: 237 раз

Отредактирован: 16 Янв, 09:24