Безопасны ли идентификаторы Boost UUID с использованием по умолчанию mt19937 RNG для идентификаторов сеанса?

Мне нужно сгенерировать UUID для использования в качестве непредсказуемых / угадываемых идентификаторов сеанса.

Это легко сделать с помощью библиотеки UUID от boost:

boost::uuids::uuid newUUID()
{
  static boost::uuids::random_generator gen;
  return gen();
}

Возвращенный UUID можно легко преобразовать в строку.

Приведенный выше код эквивалентен:

boost::uuids::uuid newUUID()
{
  static boost::uuids::basic_random_generator<boost::mt19937> gen;
  return gen();
}

Итак, мы используем генератор псевдослучайных чисел Mersenne Twister 19937. Похоже, что boost берет на себя задачу правильно заполнить его серьезный.

Однако мне интересно, можно ли получить что-то важное - с точки зрения безопасности - за счет использования недетерминированного RNG, такого как boost :: random_device, а также то, как это повлияет на скорость генерации UUID.

boost::uuids::uuid newUUID()
{
  static boost::uuids::basic_random_generator<boost::random_device> gen;
  return gen();
}

Приветствуются советы людей, разбирающихся в вопросах безопасности.


person mgd    schedule 16.09.2016    source источник
comment
Что вы имеете в виду под безопасным? AFAIK это не криптографически безопасно.   -  person NathanOliver    schedule 16.09.2016
comment
MT действительно быстрый и довольно качественный, но это не криптографический генератор случайных чисел. Скорость не будет проблемой, MT может генерировать ГБ случайных данных в секунду в обычных системах.   -  person Baum mit Augen    schedule 16.09.2016
comment
@NathanOliver Это действительно вопрос: необходимо ли использовать криптографический ГСЧ для генерации UUID, если они будут использоваться для идентификаторов сеанса, которые не должны быть предсказуемыми / предполагаемыми или достаточно безопасны для MT для этой цели.   -  person mgd    schedule 16.09.2016
comment
Какую ОС вы используете? Многие распространенные из них предоставляют средства генерации UUID, что они делают с дополнительным бонусом, практически гарантирующим отсутствие дублирования.   -  person Bathsheba    schedule 16.09.2016
comment
@Bathsheba Много разных (Linux, AIX, Windows, Mac OS X). Но дело не в уникальности, а в предсказуемости. См. Ответ и комментарии Якка ниже.   -  person mgd    schedule 16.09.2016


Ответы (1)


MT не является криптографически безопасным ГСЧ.

boost::random_device гарантированно (согласно документации) существует только в том случае, если круптографически безопасен и недетерминирован. Обратите внимание, что это не относится к std::random_device.

Для любого серьезного применения нельзя доверять простой документированной гарантии. Но для небольшого, неважного, должно хватить.

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

person Yakk - Adam Nevraumont    schedule 16.09.2016
comment
Итак, для генерации UUID, который просто должен быть уникальным, MT идеален и быстр, но для UUID, который должен быть непредсказуемым / угадываемым, как идентификатор сеанса, нужен ли криптографический RNG? Мы говорим не о генерации криптографического ключа, а об идентификаторе сеанса, который нельзя угадывать. - person mgd; 16.09.2016
comment
Вы можете использовать генератор строк и передавать ему данные из std::random_device или /dev/urandom - person sehe; 16.09.2016
comment
@mgd Некриптобезопасность означает, что кто-то со скромной информацией может отменить функцию. Например, найти следующий / предыдущий после заданного или найти шаблон после скромного выбора значений. Я не обращал внимания на то, будет ли MT генерировать достаточно уникальные значения, чтобы иметь низкую вероятность повторения ваших UUID. Я бы так предположил, но не собираюсь утверждать это без двойной проверки. Обратите внимание, что вышеизложенное предполагает, что генератор UUID из RNG не совсем глуп: глупый генератор UUID может сделать качество RNG несущественным. - person Yakk - Adam Nevraumont; 16.09.2016
comment
Спасибо за ответ. Таким образом, некриптобезопасность означает, что кто-то, имеющий доступ к одному идентификатору сеанса, может угадать другой, что неприемлемо. (Я понимаю разницу между генерацией уникальных идентификаторов и непредсказуемыми уникальными идентификаторами.) - person mgd; 16.09.2016
comment
@mgd нет, это означает, что он не подходит для ситуаций, когда безопасность имеет значение в любом случае, форме или форме. В первом приближении вы должны предположить, что контрагент может предсказать все, что он делает (свой результат в любой ситуации). Если это проблема, не используйте его. Могут быть более мелкие и менее крайние факты, но я не дам вам такой гарантии и не должен, даже если бы я думал, что знаю ответ. Если вы вообще заботитесь о безопасности, не предполагайте ничего из компонентов, не связанных с шифрованием. Я привел пример отверстия, я не дал гарантии, что это единственное отверстие. - person Yakk - Adam Nevraumont; 16.09.2016
comment
Я согласен. Вместо того, чтобы говорить «некриптобезопасные средства…», я должен был сказать «некриптобезопасность среди прочего не подразумевает никаких гарантий относительно предсказуемости». Спасибо, что нашли время помочь. - person mgd; 16.09.2016