【问题标题】:How to generate a secure session id如何生成安全会话 ID
【发布时间】:2012-07-02 09:13:20
【问题描述】:

对于 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_;

【问题讨论】:

    标签: security boost-random


    【解决方案1】:

    您可以在此处使用示例:Boost example。然后只需将大小增加到更适合会话 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 中播种了一些东西。

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

    【讨论】:

    • 我自己去测试了一下,在 Boost 随机库的版本控制中遇到了一堆问题,如果你使用最新的应该没有问题(我希望如此)。但是,如果您不想使用 boost random 库,您可以通过使用 rand() 和 srand() 生成数字并将它们修改为可读值(假设这是一个限制)来相当简单地实现这一点,它可能不是最“安全”,但这真的取决于你真正需要多少。
    • 我将使用 boost 解决方案,因为我听说 std::rand() 实现可能无法用于此类目的。谢谢你的回答。
    • 你是对的,一些 rand() 实现的循环相当糟糕,并且使用 mod 可能会稍微扭曲你的分布,更不用说随着时间的推移播种会显着降低可能的种子值。这完全取决于您需要它的真正随机性。
    猜你喜欢
    • 2014-12-30
    • 2017-08-12
    • 2021-09-16
    • 2021-10-16
    • 1970-01-01
    • 2011-02-02
    • 2015-04-03
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多