Есть ли алгоритм для уникальных "хешей" - PullRequest
1 голос
/ 17 июля 2011

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

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

Существует ли такая вещь?

Может ли это событие существовать теоретически, или это данные?уничтожить часть нормальных алгоритмов хеширования, критичных для необратимой характеристики?


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

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

Использование обычной хеш-функции может привести к ложным срабатываниям (хотя маловероятно).


I 'Я не собираюсь создавать браузер, я не планирую использовать ответ.Мне просто любопытно и мне интересно шифрование и тому подобное.

Ответы [ 7 ]

2 голосов
/ 17 июля 2011

Теоретически невозможно для выходов, которые короче, чем вход.Это тривиально следует из принципа дырки в пиджоне.

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

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


Ваш расширенный вопрос показывает две проблемы.

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

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

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

Использование обычной хэш-функции может привести к ложным срабатываниям (хотя и маловероятно).

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

Так что мой вывод - объединить секрет с медленным хешем.

byte[] secret=DeriveKeyFromPassword(pwd, salt, enough iterations for this to take perhaps a second)

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

2 голосов
/ 17 июля 2011

Дано определение хеша;

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

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

1 голос
/ 17 июля 2011

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

1 голос
/ 17 июля 2011

Ну, любой компрессор без потерь с паролем будет работать.

Или вы можете подсчитать ваш ввод с каким-то известным (вам) текстом.Это даст вам что-то, пока вход.Затем вы можете выполнить какое-то сжатие без потерь для результата, что сделает его короче.

1 голос
/ 17 июля 2011

Любая форма открытого шифрования без потерь, когда вы забываете закрытый ключ.

0 голосов
/ 17 июля 2011

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

Возможно, вместо хеша, что вы ищететакое обратимое шифрование?Это должно быть уникальным.Не будет быстрым , но будет уникальным.

0 голосов
/ 17 июля 2011

Ну как насчет хеша md5? хэш sha1?

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