Является ли вычисление хеша MD5 менее ресурсоемким для ЦП, чем функции семейства SHA?

Является ли вычисление хеша MD5 менее интенсивным для ЦП, чем SHA-1 или SHA-2 на «стандартном» аппаратном обеспечении ноутбука x86? Меня интересует общая информация, а не конкретная по конкретному чипу.

ОБНОВЛЕНИЕ: в моем случае меня интересует вычисление хэша файла. Если размер файла имеет значение, предположим, что он 300 КБ.


person Mick    schedule 27.04.2010    source источник
comment
Это не ответ на ваш вопрос, но сторонники Skein выдвинули его скорость, и в настоящее время она, безусловно, не слабее, чем у MD5 с истекшим сроком службы. В сообщениях, которые вы должны хешировать, очень короткие, скорость может быть недостатком для криптографической хеш-функции (в частности, насколько быстро кто-то другой может ее реализовать, а не как быстро она работает на вашем ноутбуке). schneier.com/skein1.2.pdf   -  person Pascal Cuoq    schedule 27.04.2010
comment
@Pascal: Skein не самый быстрый из кандидатов SHA-3, особенно на 32-битных платформах. На 64-битном x86 Skein достигает скорости около 300 МБ/с (Skein-512 несколько быстрее, чем Skein-256), что сравнимо с SHA-1, но в 32-битном режиме производительность падает до менее 60 МБ/с. с, вдвое медленнее, чем SHA-256. С другой стороны, SHABAL, еще один кандидат SHA-3, предлагает производительность, аналогичную SHA-1, как на 32-битных, так и на 64-битных платформах.   -  person Thomas Pornin    schedule 27.04.2010


Ответы (6)


Да, MD5 несколько менее требователен к процессору. На моем Intel x86 (Core2 Quad Q6600, 2,4 ГГц, с использованием одного ядра) я получаю это в 32-битном режиме:

MD5       411
SHA-1     218
SHA-256   118
SHA-512    46

и это в 64-битном режиме:

MD5       407
SHA-1     312
SHA-256   148
SHA-512   189

Цифры указаны в мегабайтах в секунду для «длинного» сообщения (это то, что вы получаете для сообщений длиннее 8 КБ). Это с sphlib, библиотекой хэшей реализации функций на C (и Java). Все реализации принадлежат одному и тому же автору (меня) и были сделаны с сопоставимыми усилиями по оптимизации; таким образом, различия в скорости можно считать действительно присущими функциям.

Для сравнения предположим, что последний жесткий диск будет работать со скоростью около 100 МБ/с, а все, что подключено через USB, будет ниже 60 МБ/с. Несмотря на то, что SHA-256 кажется здесь "медленным", он достаточно быстр для большинства целей.

Обратите внимание, что OpenSSL включает 32-разрядную реализацию SHA-512, которая намного быстрее моего кода (но не так быстро, как 64-битный SHA-512), потому что реализация OpenSSL находится в сборке и использует регистры SSE2, что невозможно сделать в простом C. SHA-512 — единственная функция из этих четырех, которая выигрывает от реализации SSE2.

Изменить: на этой странице (архив), можно найти отчет о скорости многих хэш-функций (нажмите на ссылку "Telechargez maintenant"). Отчет на французском языке, но в основном он полон таблиц и цифр, причем цифры международные. Реализованные хеш-функции не включают кандидатов SHA-3 (кроме SHABAL), но я работаю над этим.

person Thomas Pornin    schedule 27.04.2010
comment
Я не думаю, что ваши тесты полезны. Сравнение скорости двух алгоритмов, основанных на эквивалентной, но неполной оптимизации, не имеет значения. В реальном мире вы не внедряете собственную реализацию, а вместо этого используете полностью оптимизированные реализации. Результаты от них - то, что следует сравнивать. - person Edward Brey; 24.06.2015
comment
@EdwardBrey На самом деле они довольно близки к полной оптимизации. На самом деле его реализация md5 работает намного быстрее, чем та, которую предлагает OpenSSL, поэтому не каждая реализация будет оптимизирована в реальном мире, как вы говорите. Кроме того, хотя они не идеальны (в этом вы правы), имхо они служат идеальным ответом на этот конкретный вопрос. - person Gaspa79; 30.06.2016
comment
Можем ли мы получить информацию о современных процессорах и современных реализациях алгоритмов? Ваш ответ по крайней мере один раз использовался для оправдания дальнейшего использования MD5, через пятнадцать лет после того, как было доказано, что он неисправен, и через несколько лет после того, как в реальном мире произошли атаки с предварительным отображением, для создания вредоносных PE-файлов, подписанных с помощью MD5, в качестве алгоритма дайджеста, который производит то же самое точный дайджест, найденный в исходной подписи. И так подпись была пересажена. MD5 и впоследствии SHA-1 были удалены для подписи. ОП просил хэш, поэтому даже 2010 год, толкающий MD5, не был разумным советом, ИМО. - person 0xC0000022L; 07.01.2021

На моем MacBook Air 2012 года (Intel Core i5-3427U, 2x 1,8 ГГц, 2,8 ГГц Turbo) SHA-1 немного быстрее, чем MD5 (с использованием OpenSSL в 64-битном режиме):

$ openssl speed md5 sha1
OpenSSL 0.9.8r 8 Feb 2011
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              30055.02k    94158.96k   219602.97k   329008.21k   384150.47k
sha1             31261.12k    95676.48k   224357.36k   332756.21k   396864.62k

Обновление: 10 месяцев спустя с OS X 10.9 SHA-1 стал медленнее на той же машине:

$ openssl speed md5 sha1
OpenSSL 0.9.8y 5 Feb 2013
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              36277.35k   106558.04k   234680.17k   334469.33k   381756.70k
sha1             35453.52k    99530.85k   206635.24k   281695.48k   313881.86k

Второе обновление: в OS X 10.10 скорость SHA-1 вернулась к уровню 10.8:

$ openssl speed md5 sha1
OpenSSL 0.9.8zc 15 Oct 2014
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              35391.50k   104905.27k   229872.93k   330506.91k   382791.75k
sha1             38054.09k   110332.44k   238198.72k   340007.12k   387137.77k

Третье обновление: OS X 10.14 с LibreSSL работает намного быстрее (на том же компьютере). SHA-1 по-прежнему выходит на первое место:

$ openssl speed md5 sha1
LibreSSL 2.6.5
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              43128.00k   131797.91k   304661.16k   453120.00k   526789.29k
sha1             55598.35k   157916.03k   343214.08k   489092.34k   570668.37k
person nwellnhof    schedule 10.03.2013
comment
странно, мой воздух такой же, как у вас, и я получил противоположные результаты тестов. с 8192 байтами: md5 305549.52k; Ша1 204668.57k - person Carlos Fontes; 18.01.2014
comment
Хм, у меня тоже результаты другие, чем в прошлом году на той же машине: md5 381756.70k, sha1 313881.86k. Возможно, из-за обновления до 10.9 (OpenSSL 0.9.8y). - person nwellnhof; 18.01.2014
comment
Это отличный ответ. это показывает, что вы заботитесь. спасибо мужик что поделился - person M at; 16.09.2016

Правильный ответ: это зависит

Есть несколько факторов, которые следует учитывать, наиболее очевидными из которых являются: процессор, на котором вы запускаете эти алгоритмы, и реализация алгоритмов.

Например, я и мой друг запускаем одну и ту же версию openssl и получаем немного разные результаты с разными процессорами Intel Core i7.

Мой тест на работе с процессором Intel(R) Core(TM) i7-2600 с тактовой частотой 3,40 ГГц

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              64257.97k   187370.26k   406435.07k   576544.43k   649827.67k
sha1             73225.75k   202701.20k   432679.68k   601140.57k   679900.50k

И его с процессором Intel(R) Core(TM) i7 920 @ 2,67 ГГц

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md5              51859.12k   156255.78k   350252.00k   513141.73k   590701.52k
sha1             56492.56k   156300.76k   328688.76k   452450.92k   508625.68k

Мы оба используем одни и те же двоичные файлы OpenSSL 1.0.1j от 15 октября 2014 года из официального пакета ArchLinux.

Мое мнение по этому поводу заключается в том, что с дополнительной безопасностью sha1 разработчики процессоров с большей вероятностью улучшат скорость sha1, и больше программистов будет работать над оптимизацией алгоритма, чем md5sum.

Я предполагаю, что когда-нибудь md5 больше не будет использоваться, так как кажется, что у него нет никаких преимуществ перед sha1. Я также тестировал некоторые случаи на реальных файлах, и результаты всегда были одинаковыми в обоих случаях (вероятно, ограниченными дисковым вводом-выводом).

md5sum большого файла размером 4,6 ГБ заняло столько же времени, сколько sha1sum того же файла, то же самое касается многих маленьких файлов (488 в том же каталоге). Я запускал тесты дюжину раз, и они постоянно получали одинаковые результаты.

--

Было бы очень интересно исследовать это дальше. Я предполагаю, что есть некоторые эксперты, которые могли бы дать четкий ответ на вопрос, почему sha1 становится быстрее, чем md5 на новых процессорах.

person Johnride    schedule 31.10.2014
comment
Вам серьезно нужно купить SSD (и/или удалить McAfee) :) - person Maarten Bodewes; 21.11.2014
comment
@owlstead, черт возьми, я забыл отключить медленный режим своих Linux-компьютеров, когда пытался это сделать. - person Johnride; 21.11.2014
comment
@Johnride, не сравнивайте с файлом. Запустите его из данных в памяти или, что еще проще, просто перефразируйте одно и то же значение. - person Robino; 31.01.2017
comment
@Robino это то, что делает openssl speed, что является первым и наиболее значимым тестом. - person Johnride; 31.01.2017

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

MD5 выполняет меньше работы, чем SHA1 (например, меньше циклов сжатия), поэтому можно подумать, что он должен быть быстрее. Однако алгоритм MD5 в основном представляет собой одну большую цепочку зависимостей, а это означает, что он не особенно хорошо использует современные суперскалярные процессоры (то есть демонстрирует низкое количество инструкций за такт). SHA1 имеет больше возможностей для параллелизма, поэтому, несмотря на то, что требуется больше вычислительной работы, он часто оказывается быстрее, чем MD5 на современных суперскалярных процессорах. как процессор Atom на базе Silvermont), вы, как правило, обнаружите, что MD5 быстрее, чем SHA1.

SHA2 и SHA3 еще более требовательны к вычислениям, чем SHA1, и, как правило, намного медленнее.
Однако следует отметить, что некоторые новые процессоры x86 и ARM имеют инструкции для ускорения SHA1 и SHA256, что, очевидно, значительно помогает этим алгоритмам, если инструкция используется.

Кроме того, производительность SHA256 и SHA512 может демонстрировать столь же любопытное поведение. SHA512 выполняет больше работы, чем SHA256, однако ключевое различие между ними заключается в том, что SHA256 работает с использованием 32-битных слов, а SHA512 — с использованием 64-битных слов. Таким образом, SHA512, как правило, будет быстрее, чем SHA256, на платформе с 64-битным размером слова, поскольку он одновременно обрабатывает в два раза больше данных. И наоборот, SHA256 должен превосходить SHA512 на платформе с 32-битным размером слова.

Обратите внимание, что все вышеперечисленное относится только к хэшированию одиночного буфера (самый распространенный вариант использования). Если вы фантазируете и вычисляете несколько хэшей параллельно, то есть используете подход SIMD с несколькими буферами, поведение несколько меняется.

person Nyan    schedule 20.11.2020

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

person Bob the Builder    schedule 05.06.2010
comment
На первый взгляд неясно, используется ли SSE2 для ускорения одного потока MD5 или для объединения нескольких параллельных потоков MD5; последнее, конечно, легко для большинства алгоритмов, но это не считается преимуществом SSE2, поскольку обычно требуется один поток данных. - person lapo; 02.03.2011

sha1sum немного быстрее на Power9, чем md5sum

$ uname -mov
#1 SMP Mon May 13 12:16:08 EDT 2019 ppc64le GNU/Linux

$ cat /proc/cpuinfo
processor       : 0
cpu             : POWER9, altivec supported
clock           : 2166.000000MHz
revision        : 2.2 (pvr 004e 1202)

$ ls -l linux-master.tar
-rw-rw-r-- 1 x x 829685760 Jan 29 14:30 linux-master.tar

$ time sha1sum linux-master.tar
10fbf911e254c4fe8e5eb2e605c6c02d29a88563  linux-master.tar

real    0m1.685s
user    0m1.528s
sys     0m0.156s

$ time md5sum linux-master.tar
d476375abacda064ae437a683c537ec4  linux-master.tar

real    0m2.942s
user    0m2.806s
sys     0m0.136s

$ time sum linux-master.tar
36928 810240

real    0m2.186s
user    0m1.917s
sys     0m0.268s
person B Abali    schedule 17.05.2019