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 써도 되지 않을ㄲ...