2012-07-02 57 views
4

我必须生成会话ID。我想到了使用某种随机数和哈希值与会话的初始IP地址,也许是一个时间戳。如何为C++ Web服务器生成安全会话ID

这会产生一个合理的不可猜测的ID吗?什么是一个好的随机生成器算法(最好用一个boost-random来实现)?

亲切的问候 托斯滕

我的解决方案,现在看起来像:

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的,只是确保你种子srand与某事。

此外,无论如何,我不是密码学家,所以使用是你自己的风险。

+0

我只是自己测试一下,并且遇到了一些Boost随机库版本问题,如果你使用最新的版本(我希望),你应该没有问题。但是如果你不想使用boost随机库,你可以通过使用rand()和srand()生成数字并将它们修改为可读值(假设这是一种限制)来相当简单地实现它,但它可能不是最“安全”的,但这取决于你真正需要多少。 – Trickfire

+0

我打算使用boost解决方案,因为我听说std :: rand()实现可能不适用于此目的。感谢您的回答。 –

+0

你会是对的,一些rand()实现周期相当糟糕,而使用mod可能会使你的分布略微偏移,更不用说与时间一起播种可以大幅降低可能的种子值。这一切都取决于你需要它的真正随机性。 – Trickfire