coverity에서 rand 함수를 자꾸 error로 잡아서 검색해봄

rand should not be used for security related applications, as linear congruential algorithms are too easy to break.

Use a compliant random number generator, such as /dev/random or /dev/urandom on Unix-like systems, and CryptGenRandom on Windows.

결론은 rand함수가 너무 예측이 쉬운 함수니까 rand의 동작을 제대로 안할 수 있다.

unix에서는 /dev/random이나 /dev/urandom을 사용하고 window에서는 CryptGenRandom을 사용하라는 얘기


/dev/random 참고 자료

https://ko.wikipedia.org/wiki//dev/random

https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/random


unix 모든 버전에서 동작하지는 않으니 버전을 확인해서 사용해야 한다.


unix의 /dev/random은 seed값을 키보드, 마우스 같은 내부적으로 발생하는 인터럽트를 사용해 난수를 발생시킨다. 

이들의 인터럽트 값은 예측하기가 어렵기 때문에 안전하게 난수를 생성할 수 있다.

근데 서버에서 dev/random값을 사용하면 키보드나 마우스의 인터럽트가 발생하지 않는데 인터럽트가 충분히 발생할때까지 blocking을 하면서 난수가 생성되기를 기다린다고 한다. 또 머신의 성능에 따라서 영향을 많이 받는다고 한다. 따라서 서버에서는 /dev/urandom/을 사용해서 난수를 만들어야 한다. urandom은 인터럽트가 충분히 발생하지 않아도 현재 갖고 있는 시드값으로 난수를 발생시킨다. 하지만 인터럽트가 충분히 발생하지 않은 상태에서 난수를 생성하기 때문에 random보다는 보안에 취약한 편.

FreeBSD의 /dev/random은 Linux의 /dev/urandom이랑 같음 적용하기 전에 함수를 까서 확인해보자.

http://egloos.zum.com/dmlim/v/4360902


CryptGenRandom 참고자료

https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa379942(v=vs.85).aspx

https://en.wikipedia.org/wiki/CryptGenRandom
https://support.microsoft.com/ko-kr/help/983137


rand와의 차이는 암호화 기능이 들어가있는것. 또 난수가 자료형의 크기를 넘지 않는 수로 뽑아준다.

닷넷 기준으로 rnad와 100배 정도 차이난다고...

http://jacking.tistory.com/769



근데 둘다 결론적으로는 그냥 rand함수보다는 느리다는...

근데 또 rand 함수가 표준편차 기준으로 그렇게 성능이 엄청 나쁘지도 않다는데

간단한 주사위 함수 같은건 rand 써도 되지 않을ㄲ...

'C++' 카테고리의 다른 글

winapi image button  (0) 2017.08.01
char* to int  (0) 2017.04.07
int to string, int to char*  (0) 2016.12.02
cppcheck  (0) 2016.10.25
Winapi 그림판 색 고르기  (0) 2016.06.23

+ Recent posts