Создание быстрой хеш-функции для ввода фиксированной длины - PullRequest
3 голосов
/ 05 сентября 2010

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

Куски данных, которые должны быть хэшированы, имеют фиксированную длину (11 десятичных чисел - пример: 05018144298). Итак, я хотел бы знать, стоит ли создавать собственную хеш-функцию вместо использования некоторых из существующих (например, MD5), чтобы значительно сократить время обработки, и если да, то каким будет лучший способ сделать это? , Это хороший способ изменить некоторые из существующих алгоритмов (например, MD5, но разбить входные данные на куски меньшего размера и изменить другие параметры для фиксированного ввода 11 десятичных чисел) или лучше разработать хэш-функцию с нуля?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 05 сентября 2010
  1. Не стоит ничего делать с точки зрения производительности, пока вы на самом деле не измерили, что использование существующей хеш-функции действительно оказывает незначительное влияние.Типичная реализация MD5 на типичном ПК сможет обрабатывать несколько миллионов маленьких сообщений в секунду , используя одно ядро ​​на основном процессоре.Скорее всего, ваши «миллионы в день» - это кусок пирога.

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

Для вас правильнее всего использовать существующую стандартную криптографическую хеш-функцию.Кстати, это не MD5;в этой функции были выявлены серьезные недостатки (на самом деле серьезные недостатки были выявлены в 1996 году, а MD5 не рекомендовался в течение последних 15 лет).Вам лучше использовать SHA-256.

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

2 голосов
/ 05 сентября 2010

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

При этом мне непонятно, что вы хотите хэшировать:

Если это одно число с 11 цифрами, вы можете сохранить его в 64-разрядном целом числе (long long int в C). Будет ли вариант просто считать число уже хешем?

Если это 11-пучок, то есть, например, 11 32-разрядных чисел, тогда используйте существующий алгоритм, такой как MD5, SHA-1 или , какой бы вам ни понравился , который поддерживается вашей системой, например, OpenSSL. OpenSSL также поддерживает использование выделенных крипто-чипов и расширений вашего ЦП (как и все варианты MMX, но даже выделенные расширения для ускорения алгоритмов, таких как AES, которые предоставляют несколько процессоров), поэтому скорость не должна быть проблемой.

1 голос
/ 05 сентября 2010

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

Makeодноразовый блокнот (OTP).Это всего лишь таблица, в которой указан личный номер, а второй столбец содержит случайное число в том же формате.Этот второй столбец генерируется случайным образом (с использованием криптографически безопасного ГСЧ в Windows CSP или чего-то подобного) и гарантированно будет уникальным благодаря определенному для него уникальному индексу.

Используйте OTP для замены всех экземпляров идентифицируемой личностичисло с соответствующим случайным эквивалентом.Как только вы закончите, выбросьте OTP.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...