4

对于 C++ Web 服务器,我必须生成会话 ID。我想到了使用某种随机数和哈希值,以及会话的初始 IP 地址和时间戳。

这会产生一个合理的、不可猜测的 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_;
4

1 回答 1

4

您可以在此处使用示例:Boost 示例。然后只需将大小增加到更适合会话 ID 的大小,例如 64 个字符或其他内容。这样你就不必在散列或任何东西上使用计算,而且它已经是可读的。

或者不使用 boost-random 而只使用 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,你可以用 rand() 来代替 IP,只要确保你在 srand 中播种了一些东西。

另外,无论如何,我不是密码学家,所以使用风险自负。

于 2012-07-02T09:21:35.600 回答