2012-07-02 7 views
4

(C++ 웹 서버용) 세션 ID를 생성해야합니다. 어떤 종류의 난수와 해시를 세션의 초기 IP 주소와 타임 스탬프로 사용하려고 생각했습니다.보안 세션 ID를 생성하는 방법

이렇게하면 추측 할 수없는 적절한 ID가 생성됩니까? 좋은 랜덤 생성 알고리즘 (부스트 - 랜덤에 의해 구현되는 가장 바람직한 알고리즘)은 무엇입니까? Boost example :

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

답변

3

당신은 여기 예제를 사용할 수 있습니다 건설 기본 인 회원들과

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

    return out.str(); 
} 

: 같은

종류 보이는 지금 스텐

내 솔루션을 간주한다. 그런 다음 크기를 64 자 또는 somethings와 같은 세션 ID에 더 적합한 값으로 늘리십시오. 그런 식으로 해싱이나 다른 것에 계산을 사용할 필요가 없으며 이미 읽을 수 있습니다.

또는 부스트 임의 사용하고 그냥 IP를 사용하지 않고,

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(); 
} 

또는 ctime이와 STDIO.H를 사용하지 않고

, 당신은 당신 확인, IP 대신에 랜드()을 다시 펌프 수 씨를 뿌리다.

또한 모든 수단을 통해 저는 암호 작성자가 아니므로 위험은 사용자 자신의 책임입니다.

+0

나는 이걸 직접 테스트 해 보았고 Boost 무작위 라이브러리의 버전 관리에 문제가 많았으므로 최신 버전을 사용하면 문제가 발생하지 않는다. 그러나 부스트 랜덤 라이브러리를 사용하고 싶지 않다면, 간단하게 rand()와 srand()를 사용하여 숫자를 생성하고 읽을 수있는 값으로 바꿀 수 있습니다 (구속 조건으로 가정). 대부분 '안전'하지만, 실제로 얼마나 필요한지에 달려 있습니다. – Trickfire

+0

std :: rand() 구현이 그러한 목적에 유용하지 않을 수도 있다고 들었 기 때문에 boost 솔루션을 사용할 것입니다. 귀하의 답변에 감사드립니다. –

+0

당신은 정확할 것이고, 약간의 rand() 구현은 다소 빈약하게 순환 할 것이며, mod를 사용하면 배포본을 약간 비뚤어지게 할 수 있습니다. 시딩을 언급하는 것은 물론 가능한 시드 값을 극적으로 줄일 수 있습니다. 모든 것은 진정으로 무작위로 당신이 필요로하는 방법에 달려 있습니다. – Trickfire