Объединение хеш-значений MD5

Я испытал эту ошибку, потому что модуль фактически не импортировался. Код выглядел так:

import a.b, a.c

# ...

something(a.b)
something(a.c)
something(a.d)  # My addition, which failed.

Последняя строка привела к AttributeError. Дело в том, что я не заметил, что подмодули a (a.b и a.c) были явно импортированы и предположили, что оператор import фактически импортировал a.

14
задан channel72 6 February 2010 в 18:45
поделиться

5 ответов

Чтобы вычислить значения MD5 для файлов, которые слишком велики для размещения в памяти

Помня об этом, вы не хотите «комбинировать» два хэша MD5. С любой реализацией MD5 у вас есть объект, который сохраняет текущее состояние контрольной суммы. Таким образом, вы можете извлечь контрольную сумму MD5 в любое время, что очень удобно при хешировании двух файлов с одним и тем же началом. Для больших файлов вы просто продолжаете вводить данные - нет никакой разницы, хешируете ли вы файл сразу или блоками, поскольку состояние запоминается. В обоих случаях вы получите одинаковый хеш.

16
ответ дан 1 December 2019 в 09:12
поделиться

MD5 - это итерационный алгоритм. Вам не нужно вычислять тонну маленьких MD5, а затем как-то их комбинировать. Вы просто читаете небольшие фрагменты файла и добавляете их в дайджест по мере продвижения, поэтому вам никогда не нужно иметь в памяти весь файл сразу. Вот реализация java.

FileInputStream f = new FileInputStream(new File("bigFile.txt"));
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] buffer = new byte[8192];
int len = 0;
while (-1 != (len = f.read(buffer))) {
   digest.update(buffer,0,len);
}
byte[] md5hash = digest.digest();

И вуаля. У вас есть MD5 всего файла, но при этом не весь файл сразу находится в памяти.

Стоит отметить, что если по какой-то причине вам нужны MD5-хэши подразделов файла по мере продвижения (это иногда полезно для выполнения промежуточных проверок большого файла, передаваемого через соединение с низкой пропускной способностью), вы можете получить их путем клонирования объекта дайджеста в любое время, например

byte[] interimHash = ((MessageDigest)digest.clone()).digest();

Это не влияет на фактический объект дайджеста, поэтому вы можете продолжить работу с общим хешем MD5.

Также стоит отметить, что MD5 является устаревшим хешем для криптографических целей (например, для проверки подлинности файла из ненадежного источника) и в большинстве случаев его следует заменить на что-то лучшее, например SHA-1. Для не криптографических целей, таких как проверка целостности файлов между двумя надежными источниками, MD5 по-прежнему подходит.

6
ответ дан 1 December 2019 в 09:12
поделиться

Этот вопрос не имеет особого смысла, поскольку алгоритм MD5 принимает ввод любой длины. Приличная библиотека должна иметь функции, чтобы вам не приходилось добавлять все сообщение за один раз, поскольку сообщение разбивается на блоки и хешируется последовательно, причем блок, который обрабатывается, зависит только от результирующих хешей из предыдущего петля.

Псевдокод в статье википедии должен дать обзор того, как работает алгоритм.

2
ответ дан 1 December 2019 в 09:12
поделиться

Библиотека openSSL позволяет добавлять блоки данных в текущий хэш (sha1 / md5), а затем, когда вы закончите добавлять все данные, которые вы вызываете Final , и он выведет окончательный хэш.

Вы не вычисляете md5 для каждого отдельного блока, а затем добавляете его, скорее вы добавляете данные в текущий метод хеширования из библиотеки openssl. Затем это даст вам хэш md5 всех отдельных блоков данных без ограничений на размер входных данных.

http://www.openssl.org/docs/crypto/md5.html#

2
ответ дан 1 December 2019 в 09:12
поделиться

Большинство реализаций вычислений дайджеста позволяют передавать им данные меньшими блоками. Вы не можете объединить несколько дайджестов MD5 таким образом, чтобы результат был равен MD5 всего ввода. MD5 выполняет некоторые дополнения и использует количество обработанных байтов на последнем этапе, что делает исходное состояние двигателя невосстановимым из окончательного значения дайджеста.

1
ответ дан 1 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: