2016-09-16 3 views
0

예측할 수없는/추측 할 수있는 세션 ID로 사용할 UUID를 생성해야합니다.세션 ID에 대해 기본 mt19937 RNG 보안을 사용하여 부스트 UUID가 생성됩니까?

이 쉽게 boost's UUID library를 사용하여 수행 할 수 있습니다

boost::uuids::uuid newUUID() 
{ 
    static boost::uuids::random_generator gen; 
    return gen(); 
} 

반환 UUID 쉽게 문자열로 변환 할 수 있습니다.

boost::uuids::uuid newUUID() 
{ 
    static boost::uuids::basic_random_generator<boost::mt19937> gen; 
    return gen(); 
} 

그래서 우리는 메르 센 트위스터 19,937 의사 난수 생성기를 사용하고 있습니다 :에

위의 코드는 동일합니다. 부스트는 seeding it properly의 작업을 심각하게 생각합니다.

그러나 중요한 것은 보안 측면에서 boost::random_device과 같은 비 결정적 RNG를 사용하고 UUID 생성 속도에 어떤 영향을 미칠지에 대해 궁금합니다.

boost::uuids::uuid newUUID() 
{ 
    static boost::uuids::basic_random_generator<boost::random_device> gen; 
    return gen(); 
} 

보안 통찰력을 가진 사람들의 조언을 부탁드립니다.

+2

안전하다는 것은 무엇을 의미합니까? AFAIK는 암호로 안전하지 않습니다. – NathanOliver

+0

MT는 정말 빠르고 고품질이지만, 암호화 RNG가 아닙니다. 속도는 문제가되지 않지만, MT는 일반 시스템에서 초당 GB의 무작위 데이터를 생성 할 수 있습니다. –

+0

@ NathanOliver 실제로는 질문입니다 : UUID를 생성하기 위해 암호화 RNG를 사용하는 것이 예측 가능하거나 추측 할 수 없거나이 목적을 위해 충분히 안전하지 않은 세션 ID에 사용될 경우 필요합니다. – mgd

답변

2

MT는 암호로 안전한 RNG가 아닙니다.

boost::random_device은 cruptographically secure and non-deterministic 인 경우에만 (docs에 의해) 보증됩니다. 이것은 std::random_device에 해당하지 않습니다.

심각한 응용 프로그램의 경우, 문서화 된 보증을 신뢰할 수 없습니다. 그러나 소규모 중요하지 않은 경우에는해야합니다.

암호로 안전한 보안 코드 또는 시스템을 작성하는 것은 대개 잘못된 생각입니다. 누군가 당신의 시스템을 무너 뜨리는 것이 얼마나 나쁜지 묘사하십시오. 실제로 당신이 그것에 투입해야 할 노력이 얼마나 중요한지는 중요합니다.

+0

좋아요, 그렇기 때문에 유일해야 할 UUID를 생성하려면 MT가 완벽하고 빠르지 만 세션 ID와 같이 예측할 수 없거나 추측 할 수 있어야하는 UUID의 경우 암호화 RNG가 필요합니까? 우리는 암호 키를 생성하는 것이 아니라 추측해서는 안되는 세션 ID에 대해 이야기합니다. – mgd

+0

문자열 생성기를 사용하여'std :: random_device' 또는'/ dev/urandom'에서 데이터를 입력 할 수 있습니다 – sehe

+0

@mgd 비 암호화 보안이란 정보가 약한 사람이 기능을 되돌릴 수 있음을 의미합니다. 같이, 주어진 것 다음에 다음/이전 것을 찾거나, 값의 적당한 선택 후에 패턴을 찾으십시오. MT가 UUID의 반복 가능성이 낮은 고유 한 값을 생성하는 경우에는 언급하지 않았습니다. 나는 그렇게 생각할 것이다. 그러나 나는 이중 점검없이 그것을 주장하지 않을 것이다. 위의 내용은 RNG의 UUID 생성기가 완전히 바보가 아니라는 것을 전제로합니다. 바보 같은 UUID 생성기는 RNG의 품질을 무의미하게 만들 수 있습니다. – Yakk