Мне нужно сгенерировать 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. Похоже, буст берет на себя задачу правильно посеять серьезно.
Тем не менее, мне интересно, если что-то важное — с точки зрения безопасности — достигается с помощью недетерминированного RNG, такого как повышение :: random_device вместо этого, а также как это повлияет на скорость генерации UUID.
boost::uuids::uuid newUUID()
{
static boost::uuids::basic_random_generator<boost::random_device> gen;
return gen();
}
Совет от людей с пониманием безопасности приветствуется.
MT не является криптографически безопасным ГСЧ.
boost::random_device
гарантированно (документально) существует только в том случае, если он является кроптографически безопасным и недетерминированным. Обратите внимание, что это не так std::random_device
,
Для любого серьезного применения вы не можете доверять простой документированной гарантии. Но для небольшого масштаба это неважно.
Написание собственного криптографически безопасного кода или системы обычно является плохой идеей. Опишите, как плохо, что кто-то побеждает вашу систему, так как это действительно важно для того, сколько усилий вы должны приложить к ней.
Других решений пока нет …