Сколько времени занимает SHA-1 для создания хэшей? - PullRequest
11 голосов
/ 15 августа 2011

Примерно сколько и сколько вычислительной мощности требуется для создания хэшей данных SHA-1? Это сильно отличается в зависимости от исходного размера данных? Будет ли генерация хеша стандартного HTML-файла занимать значительно больше времени, чем строка «бла»? Как бы сравнили C ++, Java и PHP по скорости?

Ответы [ 3 ]

11 голосов
/ 15 августа 2011

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

SHA-1 (и многие другие хэши, разработанные для криптографической защиты) основаны на многократном применении процедуры шифрования или дешифрования к блокам данных фиксированного размера. Следовательно, при вычислении хеш-значения длинной строки алгоритм занимает пропорционально больше времени, чем вычисление хеш-значения маленькой строки. Математически мы говорим, что при использовании SHA-1 время выполнения для хэширования строки длины N равно O (N). Следовательно, хеширование HTML-документа должно занять больше времени, чем хеширование строки «бла», но только пропорционально. Создание хеша займет совсем немного времени.

Что касается сравнения C ++, Java и PHP с точки зрения скорости, это опасная территория, и мой ответ, вероятно, будет взорван, но, вообще говоря, C ++ немного быстрее, чем Java, что немного быстрее чем PHP. Хорошая реализация хэша, написанная на одном из этих языков, может значительно превзойти другие, если они не написаны хорошо. Однако вам не нужно беспокоиться об этом. Обычно считается плохой идеей реализовывать ваши собственные хэш-функции, процедуры шифрования или процедуры дешифрования, поскольку они часто уязвимы для атак по побочному каналу , в которых злоумышленник может нарушить вашу безопасность, используя ошибки в реализации. которые часто чрезвычайно трудно предвидеть. Если вы хотите использовать хорошую хеш-функцию, используйте заранее написанную версию. Вероятно, это будет быстрее, безопаснее и менее подвержено ошибкам, чем все, что вы делаете вручную.

Наконец, я бы предложил вообще не использовать SHA-1. SHA-1 имеет известные криптографические недостатки, и вам следует рассмотреть возможность использования вместо этого алгоритма сильного хеширования, такого как SHA-256.

Надеюсь, это поможет!

5 голосов
/ 15 августа 2011

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

Хорошим примером является SHA-512, хотя он работает с большими порциями данных, чем SHA-256, можно склониться к мысли, что он обычно работает медленнее, чем SHA-256, работая с меньшими входными данными, но SHA-512 особенно хорош подходит для 64-битных процессоров и иногда работает даже лучше, чем SHA-256.

Все современные алгоритмы хеширования работают с блоками данных фиксированного размера. Они выполняют фиксированное количество детерминированных операций над блоком, и делают это для каждого блока, пока вы, наконец, не получите результат. Это также означает, что чем дольше ваш ввод, тем больше времени займет операция. Из только что объясненных характеристик мы можем сделать вывод, что длина операции прямо пропорциональна размеру входного сообщения. Математически с точки зрения компьютера мы помечаем это как операцию O (n), где n - размер входного сообщения, как уже указывал templatetypedef.

Вы не должны допускать, чтобы скорость хэширования влияла на ваш выбор языка программирования, все современные алгоритмы хеширования действительно очень быстрые, независимо от языка. Хотя реализации на основе C будут работать немного лучше, чем Java, что, вероятно, снова будет немного быстрее, чем PHP, я уверен, что на практике вы не почувствуете разницу.

3 голосов
/ 15 августа 2011

SHA-1 обрабатывает данные кусками по 64 байта. Таким образом, время ЦП, необходимое для хеширования файла длиной n байт, примерно равно n / 64 раз времени ЦП, необходимого для обработки одного фрагмента. Для короткой строки вы должны сначала преобразовать строку в последовательность байтов (SHA-1 работает с байтами, а не с символами); строка "blah" станет 4 или 8 байтов (если вы используете UTF-8 или UTF-16 соответственно), поэтому она будет хешироваться как один фрагмент. Обратите внимание, что преобразование из символов в байты может занять больше времени, чем само хеширование.

Используя чистую реализацию Java SHA-1 из sphlib , на моем ПК (x86 Core2, 2,4 ГГц, 64-битный режим) я могу хэшировать длинные сообщения с пропускной способностью 132 МБ / с ( который использует одно ядро ​​процессора). Обратите внимание, что это превышает скорость обычного жесткого диска, поэтому при хешировании большого файла есть вероятность, что диск будет узким местом, а не ЦП: время, необходимое для хеширования файла, будет временем, необходимым для чтения . файл с диска.

(Кроме того, при использовании собственного кода, написанного на C, скорость SHA-1 увеличивается до 330 МБ / с.)

SHA-256 считается гораздо более безопасным, чем SHA-1, и чистая Java-реализация SHA-256 занимает 85 МБ / с на моем ПК, что все еще довольно быстро. С 2011 года SHA-1 не рекомендуется.

...