Производит ли sha-1 коллизии для ввода сообщений менее 160 бит?

У меня есть 128-битный ID, для которого я хочу выполнить односторонний хэш, но я не хочу, чтобы когда-либо получал тот же дайджест для входного сообщения. Кто-нибудь знает, гарантирован ли, что sha-1 или альтернатива не приведет к коллизиям для набора сообщений, меньшим, чем размер выходного дайджеста? Это, по крайней мере, теоретически возможно...

Я также рассмотрел использование RSA и отбрасывание закрытого ключа, чтобы дать мне односторонний шифрование, но мне нужно сохранить результат в 32-битном поле базы данных char, а доступные мне схемы шифрования не производят что-то достаточно маленькое.

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

Ваш идентификатор уникален и 128 бит.

Ваши комментарии объясняют, что вы не можете использовать ID как есть.

Вам нужно, чтобы он был уникальным, а не просто уникальным. Поэтому вы не можете использовать хэш.

У вас не может быть двух миров - у вас не может быть 1:1, которое не обратимо. Это невозможно.

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

AES имеет хорошую длину блока 128 бит, которая будет генерировать 128 бит, выводимых из ваших 128 бит ввода, быстрее, чем старые алгоритмы (!) и широко доступна для большинства платформ и языков. Я предлагаю вам использовать AES для вашей цели.

Ответ 4

Кто-нибудь знает, если sha-1 или альтернатива, гарантируется не производить столкновения

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

SHA-1, как доказано, устойчив к столкновениям, и что лучшее, на что вы можете надеяться.

Ответ 5

Я не знаю, какие хэш-функции избегают коллизий, но если вы не можете найти ответ здесь, хорошей отправной точкой может быть Perfect Hash Function в Википедии. С этой страницы:

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

Здесь есть несколько ссылок на дополнительную информацию на этой странице.

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

Ответ 6

При достаточно больших размерах битов, я думаю, что дискретное возведение в степень является функцией 1:1, но разворот является вычислительно неосуществимым. Я не уверен, как требуется "большой". Код для необычно медленной (но концептуально понятной) реализации:

unsigned long spin_once(unsigned long dat)
{
  if (dat & 1)
    return (dat >> 1);
  return (dat >> 1) ^ SomeMagicNumber;
}

unsigned long hash(unsigned long dat)
{
  unsigned long i,ret;

  if (dat == 0xFFFFFFFF)
    return 0;
  ret = 1;
  for (i=0; i < dat; i++)
    ret = spin_once(ret);
}

Эта программа займет миллиарды шагов, чтобы вычислить хэш для многих значений dat, но с более сложным кодом работа может быть выполнена в разумные сроки. Конечно, 32-битный хеш криптографически бесполезен, но подход можно легко расширить до любого размера.

Ответ 7

Не является ли точка одностороннего хеша, что вы не можете (в общем) восстановить исходные данные из хеш-значения? Итак, почему кто-то, проектируя хеш-функцию, выходит из своего пути, чтобы предотвратить столкновения для небольших входов?

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

Ответ 8

В соответствии с этой статьей http://www.debian-administration.org/users/dkg/weblog/48,

Федеральные агентства США были направленных на прекращение всякой зависимости от SHA-1 к концу 2010 года

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

Ответ 9

Хеширование "маловероятно" для создания каких-либо дубликатов, но никаких гарантий нет. На с другой стороны, любая симметричная схема шифрования будет выводить 128 бит для 128 бит, и не гарантируйте дубликатов.

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