2012-07-02 3 views
4

для веб-сервера C++ Мне нужно сгенерировать идентификаторы сеанса. Я подумал о том, чтобы использовать какое-то случайное число и хеш с начальным IP-адресом сессии и, возможно, временной меткой.Как сгенерировать идентификатор безопасного сеанса

Будет ли это давать разумный неопознанный идентификатор? Каким будет хороший алгоритм случайных генераторов (наиболее предпочтительный вариант, реализованный с помощью ускорения-случайного)?

вид касается Торстен

Мое решение теперь выглядит следующим образом:

std::string secure_session_generator::operator()(const char* /* network_connection_name */) 
{ 
    std::stringstream out; 
    out << std::hex << distribution_(generator_); 

    return out.str(); 
} 

с членами являются конструктором по умолчанию:

boost::random::random_device          generator_; 
    boost::random::uniform_int_distribution<boost::uint_least64_t> distribution_; 

ответ

3

Вы можете использовать пример здесь: Boost example. Затем просто увеличьте размер до более подходящего идентификатора сеанса, например, 64 символа или чего-то еще. Таким образом, вам не нужно использовать вычисления при хэшировании или что-то еще, и это уже читаемо.

Или без наддува случайны и только с помощью CTIME и stdio.h

string getRandom(int ip) 
{ 
    srand(time(NULL) + ip + rand()); 
    stringstream ss; 
    for(int i = 0;i < 64;i++) 
    { 
      int i = rand() % 127; 
      while(i < 32) 
        i = rand() % 127; 
      ss << char(i); 
    } 
    return ss.str(); 
} 

В качестве альтернативы, без использования IP, вы можете просто накачать обратно рандов() вместо IP, просто убедитесь, что вы семя срань с чем-то.

Кроме того, я не криптограф, поэтому используйте свой собственный риск.

+0

Я просто пошел, чтобы проверить это сам, и столкнулся с кучей проблем с версированием в случайной библиотеке Boost, у вас не должно быть проблемы, если вы используете новейшую (я надеюсь). Но если вы не хотите использовать ускоренную библиотеку, вы можете реализовать это достаточно просто, используя rand() и srand() для генерации чисел и изменения их до читаемых значений (при условии, что это сдержанность), это может быть не большинство «безопасных», но это действительно зависит от того, сколько вам действительно нужно. – Trickfire

+0

Я собираюсь использовать решение для повышения, поскольку я слышал, что реализация std :: rand() может не использоваться для таких целей. Спасибо за Ваш ответ. –

+0

Вы были бы правы, некоторые реализации rand() выполняются довольно плохо, и использование мода может немного исказить ваше распределение, не говоря уже о посеве, время может резко снизить возможные значения семян. Все зависит от того, насколько это действительно важно для вас. – Trickfire