Один из способов хэша (не для крипто/безопасность), используйте SHA256 (а не MD5, SHA-1)?

В новой системе нам требуется односторонний хэш для вычисления цифровой подписи из двоичного ввода (например, килобайт текста или большие текстовые и двоичные файлы). Потребность аналогична тому, как Scons (сборка системы) хеширует командные строки и исходные файлы и как Git (система управления версиями) хэширует файлы для вычисления подписи для хранения/синхронизации.

Вспомним, что Scons использует MD5, а Git использует SHA-1.

В то время как MD5 и SHA-1 были "сломаны", ни Scons, ни Git не используют свои хэши специально для безопасности (например, не хранить пароли), поэтому общая практика по-прежнему считает эти алгоритмы приемлемыми для этого использования. (Конечно, это частично рационализация из-за унаследованного наследия.)

ВОПРОС: Не могли бы вы использовать SHA256 (а не MD5 или SHA-1) для однонаправленного хэша (не крипто/безопасность) в новой системе?

Вы можете:

  • MD5 и SHA-1 имеют долгую историю принятия
  • SHA256 относительно новый (не так много истории), но как представляется, в настоящее время рекомендуется для новой работы (но "Сильная" сила алгоритма не специально для моего приложение)
  • SHA256 более дорого стоит времени вычислить
  • SHA256 производит более длинный ключ (эти будут использоваться как имена файлов/файлов и хранится в индексных файлах), но я предположим, что я мог бы усечь (хэш менее сильный, но должно быть достаточно), или просто предположим, что хранение дешево, и файловые системы могут его обрабатывать.

Меня особенно интересовал бы ответ, отвечающий сообществам Scons или Git, говорящим: "Мы будем держать нас навсегда!" или "Мы хотим как можно скорее перейти к новому хешу!" (Я не уверен, каковы их планы?)

Ответы

Ответ 1

Да, я бы использовал SHA-256. SHA-256 имеет гораздо больше, чем соображения безопасности; на самом деле одна из причин, по которой SHA1 необходимо было заменить, была по той причине, что вам нужна хеш-функция. Алгоритм хеширования дает конечный результат сайта; имея неопределенный объем ввода. В конце концов произойдет столкновение. Чем больше выход; тем меньше вероятность столкновения (при использовании правильного алгоритма хеширования).

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

Чтобы посмотреть на свои очки:

  • SHA256 был достаточно одинок, если возникли проблемы; мы должны были увидеть их к настоящему времени.
  • Это не "более сильный" per se, у него меньше шансов произвести столкновение (если это ваши критерии для более сильного, то да, это сильнее).
  • SHA-256 работает медленнее; да. Гораздо медленнее? В зависимости от ваших потребностей. Для 95% людей; его производительность приемлема при условии, что вы используете правильную реализацию.
  • В общем, усечение хэша SHA2 является хорошо, что нужно делать.

Ответ 2

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

У хорошо набитого жесткого диска может быть 1M файл. Для эксперимента предположите, что есть 10M файлов. Скажем, что население мира составляет 10.000 млн. Человек, каждый с одним компьютером, и каждый файл отличается.

Мы будем бороться с несколькими разными файлами 10E6 * 10E9 = 1E17, < 2 ^ 57

Вероятность столкновения MD5 в таком далеком случае будет меньше 1 в 2 ^ 71 или меньше одного в приблизительно 2E21! Чтобы представить это в перспективе, для вероятности столкновения 1 в 10 м нам пришлось бы повторять эксперимент примерно 2E14 раз, то есть заменять каждый файл каждый час после Большого взрыва, а затем продолжать движение еще на несколько миллиардов лет.

2E14/24/365/13500E6 = 1,69

Конечно, с SHA1 или SHA256 вероятности были бы еще меньше, а также была бы стойкость к вредоносной атаке - в отличие от MD5, было бы невозможно (сейчас), чтобы кто-то создал файлы специально для того, чтобы иметь одинаковые хэш.

Ответ 3

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

На оборотной стороне SHA-1 имеет гораздо больший шанс столкновения, чем SHA-256. Поймите, хотя такие шансы минимальны (1 из 2 ^ 160/2, я думаю, для SHA-1) и, вероятно, никогда не пострадают от большинства приложений. Однако, чем больше вещей вы хэш, тем выше вероятность. Если вы хешируете миллионы или миллиарды вещей, это может быть проблемой.

Ответ 4

Для повышения безопасности (однако это может быть определено) с ограниченными возможностями для злоумышленников или несчастных случаев, которые вы, возможно, захотите рассмотреть, солить или использовать варианты с ключами (HMAC). Также небольшие трюки, такие как префикс Git, который включает в себя длину сообщения или CRC, могут усложнить для злоумышленника сообщение устройства, имеющее не только тот же хеш, но и допустимый формат.

Вы также можете думать о более крупных хешах, таких как деревья, используемые ледником (Amazon) или Branch Cache Hash (Microsoft) или некоторые одноранговые сети, такие как BitTorrent или другие конструкторы Merkle или Tiger Tree.