Как долго SHA-1 принимает для создания хешей?

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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 MB/s на моем ПК, который все еще довольно быстрый. По состоянию на 2011 год SHA-1 не рекомендуется.