#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 бит или что-то в этом роде и выполнить вычисление по модулю, хотя результат такого подхода может быть менее равномерно распределен, чем описанный выше.