Генерация действительно глобально уникальных идентификаторов для многих клиентов и серверов.

Резюме

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

Подробности

Мне нужно сгенерировать глобально уникальные идентификаторы для объектов. У меня есть несколько серверных «систем», написанных на java, которые должны иметь возможность обмениваться идентификаторами; каждая из этих систем также имеет набор клиентов flex/javascript, которые фактически генерируют идентификаторы для новых объектов. Мне нужно гарантировать глобальную уникальность в наборе несвязанных систем; например, мне нужно иметь возможность объединять/синхронизировать базы данных двух независимых систем. Я должен гарантировать, что между этими идентификаторами никогда не будет коллизии и что мне никогда не потребуется менять идентификатор объекта после его создания. Мне нужно иметь возможность генерировать идентификаторы в клиентах flash и javascript, не связываясь с сервером для каждого идентификатора. Решение, основанное на каком-либо начальном или системном идентификаторе, предоставленном сервером, подходит, если к серверу не обращаются слишком часто. Решение, которое работает полностью в автономном режиме, является предпочтительным. Точно так же решение, не требующее предварительной регистрации систем, предпочтительнее, чем решение, основанное на центральном органе (например, OUI в MAC-адресе).

Я знаю, что очевидное решение — «использовать генератор UUID», такой как UIDUtil во flash.Эта функция специально отказывается от глобальной уникальности. В общем, я беспокоюсь о том, чтобы полагаться на PRNG, чтобы гарантировать глобальную уникальность.

Предлагаемые решения

Полностью полагаться на безопасныйгенератор случайных чисел в клиенте.

Flash 11+ имеет flash.crypto.generateRandomBytes; Javascript имеет window.crypto, но он довольно новый и не поддерживается в IE. Существуют такие решения, как sjcl, которые используют мышь для добавления энтропии.

Я понимаю, что при идеальном RNG вероятность столкновения для 2 122случайных UID ничтожно мала, но я беспокоюсь, что на самом деле я не получу такой степени случайности в javascript или флеш-клиент. Меня также беспокоит то, что типичный вариант использования даже криптографического ГСЧ отличается от моего: для сеансовых ключей и т. д. коллизии допустимы, если они непредсказуемы для злоумышленника. В моем случае коллизии совершенно недопустимы. Должен ли я действительно полагаться на необработанные выходные данные защищенного генератора случайных чисел для получения уникального идентификатора?

Сгенерируйте составнойID, который включает ID системы, сеанса и объекта.

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

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

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

Ключевые вопросы

  • Случайные или составные?
  • Включить идентификатор системы?
  • Если идентификатор системы: сгенерировать случайный идентификатор системы или использовать центральный реестр?
  • Включить отметку времени или какой-либо другой одноразовый номер?
  • Хешировать или не хешировать?
12
задан Christopher Mason 22 May 2012 в 07:54
поделиться