Сколько времени занимает SHA-1 для создания хэшей?

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

3 ответов


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

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

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

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

надеюсь, что это помогает!


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

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

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

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


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

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

(также, используя собственный код, написанный на C, скорость SHA-1 доходит до 330 МБ / с.)

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