2012-07-02 103 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