Алгоритм уникальной идентификации пользователя

#security #math

#Безопасность #математика

Вопрос:

Я пишу сервис для анонимного комментирования (плагин для социальной сети). Я должен сгенерировать псевдоуникальный номер для каждого пользователя в потоке.

Таким образом, каждая запись имеет уникальный номер (например, 6345), а каждый пользователь имеет уникальный идентификатор (9144024). Используя эту информацию, мне нужно сгенерировать уникальный индекс в массиве аватаров.

Допустим, есть массив из 312 изображений, он статичен, и все изображения каждый раз находятся в одном и том же порядке.

Теперь алгоритм выглядит так:

 (post id   user id) % number if images = index

(6345   9144024) % 312 = 33
 

И в комментарии я показываю изображение с индексом 33. Проблема в том, что можно найти user id по изображению, если кто-то найдет способ генерации изображений (список изображений всегда находится в одном и том же порядке).

Каков наилучший способ здесь, например, без сохранения данных для каждой публикации в базе данных?

Комментарии:

1. Я думаю, вам нужно добавить в него случайность. в противном случае вы сможете получить идентификатор пользователя (если сможете получить достаточно информации). Может быть, вы можете просто выбрать случайное изображение и пометить его как «используемое» для этого потока?

Ответ №1:

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

При таком подходе я бы интерпретировал результат хэширования как одно 160-битное целое число. Если у вас нет большой целочисленной библиотеки под рукой, вы можете выполнять вычисления по модулю постепенно. Начните с самого старшего байта, а затем на каждом шаге умножьте текущее значение на 28, добавьте следующий байт и уменьшите сумму по модулю 312. Вы также можете просто взять младший 32 или 64 бит или что-то в этом роде и выполнить вычисление по модулю, хотя результат такого подхода может быть менее равномерно распределен, чем описанный выше.