возможно ли идеальное хеширование без ведер?

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

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

Ваше здоровье

Редактировать:

Постараюсь дать больше информации :)

1) 10 ^ 11 на самом деле теперь 10 ^ 10, так что это упрощает. Это число — возможные комбинации. Таким образом, мы можем получить число от 0000000001 до 10000000000 (10^10).

2) План состоит в том, чтобы мы сделали это частью односторонней функции, чтобы сделать номер безопасным, чтобы мы могли отправлять его небезопасными средствами. Затем мы будем искать исходное число на другом конце, используя радужную таблицу. Проблема в том, что исходные устройства обычно имеют 512k-4Meg памяти для использования.

3) он должен быть идеальным - у нас 100% не может быть коллизии.

Редактировать2:

4) Мы не можем использовать шифрование, так как нам сказали, что это невозможно на устройствах, а управление ключами было бы кошмаром, если бы мы могли.

Редактировать3:

Поскольку это неразумно, теперь это чисто академический вопрос (обещаю)


person Dreaddan    schedule 03.02.2011    source источник
comment
Вы видели sux (sux4j.dsi.unimi.it)?   -  person Kai Sternad    schedule 03.02.2011
comment
10 ^ 11 ваше пространство ключей или количество фактически занятых ключей?   -  person bdonlan    schedule 03.02.2011
comment
Итак, вы хотите использовать одностороннюю функцию, чтобы сделать номер защищенным, а затем взломать его на другом конце? Почему бы просто не зашифровать номер обычным алгоритмом шифрования, отправить его и расшифровать на другой стороне?   -  person R. Martinho Fernandes    schedule 03.02.2011
comment
@Martinho Fernandes: Basilcy, да ... Мне сказали, что мы не можем выполнять шифрование на устройствах, поэтому было придумано это решение.   -  person Dreaddan    schedule 03.02.2011
comment
@Dreaddan: Но в этом нет никакого смысла! Если вы взламываете его, вы доказываете его ненадежность! Как вы можете защитить данные для передачи, не используя какую-либо форму шифрования? Если вы хотите преобразовать данные в какую-либо безопасную форму, а затем обратно, вам нужна двусторонняя функция, также известная как шифрование.   -  person R. Martinho Fernandes    schedule 03.02.2011
comment
Если каждое значение допустимо, для чего нужна «безопасность»? Если у вас есть миллиард допустимых команд, то вы просто меняете идентификатор каждой команды, если у вас есть только несколько чисел, которые что-то значат, то у вас нет большой таблицы. Вы также можете подумать об атаках с повторным воспроизведением — если X происходит, когда сниффер видит значение Y в сети, то они знают, что Y делает X.   -  person Pete Kirkham    schedule 03.02.2011
comment
@Martinho Fernandes: Фактически и да, и нет. Да, вы можете вычислить его, но не зная хэша fn и соли, которая будет меняться по крайней мере каждый день, это делает его более безопасным.   -  person Dreaddan    schedule 03.02.2011
comment
@pete: это хороший момент .. мне придется взять это назад и выяснить, о чем они думают / были ..   -  person Dreaddan    schedule 03.02.2011
comment
Вы заметили, что эффективно разрабатываете двустороннюю функцию (второй частью является поиск в радужной таблице) и используете эту соль, которую вы меняете ежедневно, как если бы это был ключ шифрования? Вы понимаете, что каждый раз, когда вы меняете соль, вам придется пересчитывать радужную таблицу? И что вам не нужно ничего хранить на исходном устройстве? Все, что вам нужно в исходниках, это алгоритм хеширования. Только пункт назначения нуждается в радужном столе.   -  person R. Martinho Fernandes    schedule 03.02.2011
comment
@Martinho Fernandes: да, да, да... не совсем. Я знаю, что стол не нужен устройству, но мне сказали, что мы не можем использовать pmh Боба Дженкинса, так как устройство не может удерживать ведра. Хеширование (реализация) - это что-то новое для меня, и мне пришлось очень долго учиться... и нет, я ни за что не напишу его!   -  person Dreaddan    schedule 03.02.2011
comment
ped — это имя, которое мы называем устройством. Насколько я понимаю, ведра используются для генерации минимального хэша, а таблица будет использоваться для поиска. Я чувствую, что нужно больше читать   -  person Dreaddan    schedule 03.02.2011


Ответы (2)


Хорошо, поскольку вы пояснили, что пытаетесь сделать, я переписал свой ответ.

Подводя итог: используйте настоящий алгоритм шифрования.

Во-первых, позвольте мне объяснить, почему ваша система хеширования — плохая идея.

Какая у вас система хеширования?

Насколько я понимаю, предлагаемая вами система выглядит примерно так:

Ваша встроенная система (которую я буду называть C) отправляет какие-то данные с пространством значений 10 ^ 11. Эти данные должны быть конфиденциальными при передаче на какой-то сервер (который я буду называть S).

Ваше предложение состоит в том, чтобы отправить значение hash(salt + data) в S. Затем S будет использовать радужную таблицу для реверсирования этого хэша и восстановления данных. salt — это общее значение, известное как C, так и S.

это алгоритм шифрования

Алгоритм шифрования — это любой алгоритм, обеспечивающий конфиденциальность. Поскольку вашей целью является конфиденциальность, любой алгоритм, удовлетворяющий вашим целям, является алгоритмом шифрования, включая этот.

Это очень плохой алгоритм шифрования

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

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

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

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

Это не быстрее, чем реальный алгоритм шифрования на встроенном устройстве.

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

  • Выделите 12 32-битных переменных.
  • Выделить 80 32-битных слов для расширенного сообщения
  • 64 раза: выполнить три поиска в массиве, три 32-разрядных исключающих операции и операцию поворота.
  • 80 раз: выполнить до пяти 32-битных бинарных операций (некоторая комбинация xor, and, or, not и and в зависимости от раунда); затем поворот, поиск в массиве, четыре добавления, еще один поворот и несколько загрузок/сохранений памяти.
  • Выполнить пять 32-битных дополнений до двух

На каждые 512 бит сообщения приходится один фрагмент плюс возможный дополнительный фрагмент в конце. Это 1136 бинарных операций на чанк (не считая операций с памятью), или около 16 операций на байт.

Для сравнения, алгоритм шифрования RC4 требует четырех операций (три сложения плюс операция xor над сообщением) на байт, плюс два чтения массива и две записи массива. Для этого также требуется всего 258 байт оперативной памяти по сравнению с 368 байтами для SHA-1.

Управление ключами является фундаментальным

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

Итак, у вас есть два варианта, куда поместить секретность. Один из вариантов — сделать алгоритмы шифрования/дешифрования секретными. Однако, если код (или двоичные файлы) для алгоритма когда-либо просочится, вы проиграете — такой алгоритм довольно сложно заменить.

Таким образом, секреты обычно легко заменяются — это то, что мы называем ключом.

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

Что вы должны сделать?

Используйте реальный алгоритм шифрования и потратьте некоторое время на размышления об управлении ключами. Эти вопросы были решены ранее.

Во-первых, используйте реальный алгоритм шифрования. AES был разработан для обеспечения высокой производительности и низких требований к оперативной памяти. Вы также можете использовать потоковый шифр, такой как RC4, как я упоминал ранее. Однако при использовании RC4 следует остерегаться того, что вы должны отбросить первые 4 килобайта или около того вывода из шифра, иначе вы будете уязвимы для того же самого. атаки, которые заражают WEP.

Во-вторых, подумайте об управлении ключами. Один из вариантов — просто записать ключ в каждый клиент и физически выйти и заменить его, если клиент скомпрометирован. Это разумно, если у вас есть легкий физический доступ ко всем клиентам.

В противном случае, если вас не интересуют атаки «человек посередине», вы можете просто использовать обмен ключами по Диффи-Хеллману для согласования общего ключа между S и C. Если вас беспокоят MitM, вам нужно начать искать ECDSA или что-то еще для аутентификации ключа, полученного при обмене D-H. Помните, что когда вы начинаете идти по этому пути, легко ошибиться. Я бы порекомендовал внедрить TLS в этот момент. Это не выходит за рамки возможностей встроенной системы — действительно, существует количество встроенных коммерческих (и открытых источник) библиотеки доступно уже. Если вы не реализуете TLS, то по крайней мере попросите профессионального криптографа просмотреть ваш алгоритм перед его внедрением.

person bdonlan    schedule 03.02.2011
comment
План состоит в том, чтобы сделать это частью односторонней функции, чтобы сделать номер безопасным, чтобы мы могли отправлять его небезопасными средствами. Затем мы будем искать исходное число на другом конце, используя радужную таблицу. Проблема в том, что исходные устройства обычно имеют 512k-4Meg памяти для использования. - person Dreaddan; 03.02.2011
comment
@Dreaddan, обновил мой ответ. Вкратце: хэш — неправильный инструмент для работы. - person bdonlan; 03.02.2011
comment
AES был моим первым выбором, но нам сказали, что на самом деле это невозможно на устройствах, и управление клавишами было бы кошмаром, если бы мы могли. - person Dreaddan; 03.02.2011
comment
@Dreaddan, помимо AES, есть и другие варианты шифрования, и многие из них не дороже, чем SHA1 или другие хэши, но то, что вы пытаетесь сделать, - это шифрование, чистое и простое. Делая глупости с хешами, вы вообще не получите никакой безопасности — управление ключами (и существование ключа) основополагающее условие безопасности в подобных случаях. И всегда будет возможность столкновения. Если вам действительно не хватает вычислительной мощности, попробуйте RC4, но убедитесь, что вы отбрасываете первые несколько килобайт потока. - person bdonlan; 04.02.2011
comment
Кроме того, для более глубокого обсуждения вашей проблемы было бы полезно, если бы вы открыли новый вопрос, спрашивая, что вы действительно хотите сделать, т.е. заморочено такими темпами :) - person bdonlan; 04.02.2011
comment
@Dreaddan, значительно обновил мой ответ. Пожалуйста, спросите, если вам нужны дополнительные разъяснения :) - person bdonlan; 04.02.2011
comment
@bdonlan приветствует - это то, чего я ожидал от реализации. Я думаю, что реальный ответ заключается в том, что если генерация хэша не более интенсивна, чем использование правильного метода шифрования, то мы могли бы сделать это. - person Dreaddan; 04.02.2011

Очевидно, что не существует такого понятия, как «идеальный» хэш, если у вас нет по крайней мере столько же хэш-сегментов, сколько входных данных; если вы этого не сделаете, то неизбежно для двух ваших входных данных будет возможно совместное использование одного и того же хеш-ведра.

Однако маловероятно, что вы будете хранить все числа от 0 до 10^11. Итак, какова схема? Если есть шаблон, может быть идеальная хеш-функция для вашего фактического набора данных.

В любом случае, на самом деле не так уж важно найти «идеальную» хеш-функцию. Хеш-таблицы работают очень быстро. Функция с очень низкой частотой столкновений — а при хешировании целых чисел это означает, что почти любая простая функция, такая как модуль, — подойдет, и вы получите среднюю производительность O (1).

person apenwarr    schedule 03.02.2011
comment
+1. Идеальное хэширование без абсолютного знания входных данных — это безумие. - person R. Martinho Fernandes; 03.02.2011
comment
она должна быть идеальной - у нас 100% не может быть коллизии. @Martinho Fernandes: Нам известен диапазон данных, это число от 0 до 10000000000 (10^10). - person Dreaddan; 03.02.2011
comment
@Dreaddan: вы должны четко указать это в вопросе: у меня есть числа 10 ^ 10, это не то же самое, что у меня есть числа от 0 до 10 ^ 10. Сравните У меня есть 3 числа: 42, 23, 17 с У меня есть числа между 1 и 3: 1, 2, 3. - person R. Martinho Fernandes; 03.02.2011