Резюме
Действительно глобально уникальные идентификаторы во flash и/или javascript-клиентах. Могу ли я сделать это с помощью RNG, доступного в текущих браузерах /flash, или мне нужно построить составной идентификатор с случайной случайностью на стороне сервера?
Подробнее
Мне нужно генерировать глобально уникальные идентификаторы для объектов. У меня есть несколько "системных" систем на стороне сервера, написанных в java, которые должны иметь возможность обменивать идентификаторы; каждая из этих систем также имеет набор клиентов flex/javascript, которые фактически генерируют идентификаторы для новых объектов. Мне нужно гарантировать глобальную уникальность во множестве несвязанных систем; например, мне нужно иметь возможность объединять/синхронизировать базы данных двух независимых систем. Я должен гарантировать, что никогда не было столкновений между этими идентификаторами и что мне никогда не нужно менять идентификатор объекта после его создания. Мне нужно иметь возможность генерировать идентификаторы во Flash и javascript-клиентах, не связываясь с сервером для каждого идентификатора. Решение, которое полагается на какой-либо сервер, предоставило семенной или системный идентификатор, является прекрасным, если сервер не связывается слишком часто. Предпочтительно решение, которое работает полностью отключено. Аналогично, решение, которое не требует предварительной регистрации систем, предпочтительнее того, которое полагается на центральный орган (например, OUI по MAC-адресу).
Я знаю, что очевидным решением является "использование генератора UUID", например UIDUtil во flash. Эта функция специально отказывается от глобальной уникальности. В общем, я беспокоюсь о том, чтобы полагаться на PRNG, чтобы гарантировать глобальную уникальность.
Предлагаемые решения
Положитесь на защищенный генератор случайных чисел в клиенте.
Flash 11+ имеет flash.crypto.generateRandomBytes; Javascript имеет window.crypto, но он довольно новый и не поддерживается в IE. Существуют такие решения, как sjcl, которые используют мышь для добавления энтропии.
Я понимаю, что при идеальном RNG вероятность столкновения для случайного UID 2 122 является метеоритом крошечным, но я беспокоюсь, что на самом деле я не получаю эту степень случайности в javascript или флеш-клиентом. Я также обеспокоен тем, что типичный пример использования даже криптографического RNG отличается от моего: для сеансовых ключей и т.д. Конфликты приемлемы, если они непредсказуемы злоумышленником. В моем случае столкновения совершенно неприемлемы. Должен ли я действительно полагаться на исходный вывод безопасного RNG для уникального идентификатора?
Сгенерировать составной идентификатор, который включает идентификаторы системы, сессии и объекта.
Очевидной реализацией будет создание системного UUID во время установки сервера, сохранение идентификатора сеанса для каждого клиента (например, в базе данных), а затем отправка идентификатора системы и сеанса на клиент, который будет хранить каждый -сегментный счетчик. Uid будет тройной: идентификатор системы, идентификатор сеанса, клиентский счетчик.
Я мог вообразить, что они непосредственно конкатенации или хэширования их криптографическим хэшем. Я обеспокоен тем, что сам хеширование может потенциально привести к столкновениям, особенно если вход в хеш файл примерно такого же размера, как и выход. Но хэш затенил бы идентификатор системы и счетчики, которые могли бы утечка информации. Вместо того, чтобы генерировать идентификатор системы во время установки, другим решением было бы иметь центральный реестр, который выдавал бы уникальные системные идентификаторы, вроде того, что делает DOI. Это требует большей координации, но, я думаю, это единственный способ действительно гарантировать глобальную uniquness.
Ключевые вопросы
- Случайная или композитная на основе?
- Включить идентификатор системы?
- Если системный идентификатор: сгенерировать случайный идентификатор системы или использовать центральный реестр?
- Включить метку времени или какой-то другой nonce?
- К хешу или не к хешу?