Регистрация IP-адреса для уникальности без сохранения самого IP-адреса для конфиденциальности - PullRequest
3 голосов
/ 29 декабря 2010

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

Если я правильно понимаю, то решение MD5, SHA1 или SHA256 может быть решением. Интересно, не слишком ли они дороги в плане обработки?

Мне было бы интересно любое решение, если бы в Perl была реализация, которая была бы еще лучше.

Ответы [ 6 ]

6 голосов
/ 29 декабря 2010

Я думаю, что MD5 будет хорошим и достаточно быстрым.Вы бы хотели добавить несколько постоянных символов соли, чтобы избежать поиска по радуге в таблице / в Интернете.Например, строка «127.0.0.1» имеет md5 f528764d624db129b32c21fbca0cb8d6, который имеет довольно много хитов Google."szabgab127.0.0.1", с другой стороны, получает "Ваш поиск - 501ff2fbdca6ee72247f8c61851f17b9 - не соответствует ни одному документу" (пока я не отправлю этот ответ ...)

1 голос
/ 29 декабря 2010

Опираясь на ответы @marcog и @daxim, вы можете использовать HMAC, например HMAC-SHA , с жестко запрограммированным секретным ключом на устройстве создания журнала. Если секрет раскрыт, то схема становится примерно такой же слабой, как любая из приведенных здесь.

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

1 голос
/ 29 декабря 2010

Использование Отпечаток Рабина . Это быстро и легко реализовать.

Учитывая n-битное сообщение m 0 , ..., m n-1 , мы рассматривать его как многочлен степени n-1 над конечным полем GF (2).

Затем выбираем случайное неприводимое полином p (x) степени k над GF (2), и мы определяем отпечаток пальца из м быть остатком г (х) после деление f (x) на p (x) над GF (2) который можно рассматривать как многочлен степень k-1 или число k-бит.

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

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

0 голосов
/ 15 января 2011

Другой вариант - Crypt :: Eksblowfish :: Bcrypt . Причина, по которой он «лучше», заключается именно в том, что он (eks) задумчив - насколько дорогой является перестраиваемый - что делает попытки взлома где-то от несколько до нелепо нецелесообразными. Для вашего приложения вы можете кэшировать зашифрованные IP-адреса, чтобы они не замедлялись, когда дубликаты были видны, по крайней мере.

0 голосов
/ 15 января 2011

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

Самое простое, что можно сделать, это использовать фильтр Блума.В частности, реализация фильтра C ++ Bloom на http://www.afflib.org/ позволяет добавлять произвольные строки в фильтр Bloom и затем проверять, присутствуют ли они или нет.Если вы хотите защитить себя от атаки грубой силы, просто увеличьте частоту ложных срабатываний, чтобы она составляла 1 на миллиард.Тогда у вас будет уникальность, но люди не смогут выяснить, какие IP-адреса вы видели.

0 голосов
/ 29 декабря 2010

⚠ Больше не используйте MD5 или SHA-1 .⚠ См. Статьи об их слабостях.

Используйте вместо этого соленую SHA-2 , Crypt :: SaltedHash обеспечивает хорошую абстракцию.Рекомендуемая привязка Perl Digest :: SHA и использует XS.

Вы говорите о дорогих.Вы уже профилировали код?Код еще не написан?Тогда слишком рано думать об оптимизации .Безопасность должна быть в первую очередь.


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

use Crypt::SaltedHash;
my $normalised_string_representation_of_internet_address = '::1';    # or perhaps '10.10.10.10'

# when you first get an address, make a hash and store it
my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-512', salt_len => 32);
$csh->add($normalised_string_representation_of_internet_address);
my $salted = $csh->generate;

# later retrieve the hash and see whether it matches
my $valid = Crypt::SaltedHash->validate($salted, $normalised_string_representation_of_internet_address, 32);
...