/dev/random에서 랜덤값 읽기 문제

leilei의 이미지

굉장히 빈번하게 랜덤값이 필요한 데몬이 있는데요...
그동안 C 표준함수로 사용하다가 /dev/random을 사용해 볼까 했는데..

문제는 키보드나 마우스가 없는 idc내의 서버라 그런지
랜덤값이 너무 천천히 발생한다는 점입니다..

joinc에서는 조용한 시스템이라고 표현을 하셨네요.... :)
먼가 다른 방법으로 앤트로피 풀을 채울 수 있는 방법이 없을까요?

cdpark의 이미지

/dev/random에서 얻은 값을 seed로 해서 C 함수인 random()을 이용하는 건 어떨까요?

eungkyu의 이미지

/dev/random은 원래 런덤적 성향이 강한 대신 바로바로 안나오는 수도 있다고 하네요. /dev/urandom은 랜덤적 성향이 조금 덜하지만 바로바로 값이 나온다고 합니다.

프로그램 짤 때는 cdpark님이 말한 대로 하는 것이 제일 좋은 방법인 듯 합니다 :)

ironiris의 이미지

방금전에 사용한 랜덤값을 seed 로 이용하는 것은 어떨런지요?

발로차는새의 이미지

http://www.kernel.org/pub/linux/kernel/people/rml/netdev-random/README-netdev-random

테스트 PC에서 동작시켜 봤는데 잘 동작 합니다 8)

yundream의 이미지

/dev/random은 앤트로피 풀에 있는 노이즈를 이용해서 랜덤값을 만들어 냅니다.
노이즈는 하드디스크, 마우스, 키보드와 같은 장치에서 발생하는 값인데,
만약 이들에게 입출력이 발생하지 않는다면 앤트로피 풀을 충분히 채우지 못하게
되고 오랜 시간동안 랜덤값을 리턴하지 않는 경우가 생길 수 있습니다.

그래서 최초 암호화 통신을 할 때 사용될 key값을 정의하는 등의 단회성이 강한
부분에 사용하고
지속적으로 랜덤값을 만들어야 하는경우에는 적당한방법이 아닙니다.

커널 2.6에서는 (문서상) /dev/random의 성능이 좋아 졌다고 해서 테스트 해봤는데
이 문제는 여전하더군요..

이런 이유로 지속적으로 랜덤값을 생성해야 하는 경우 random()을 약간 응용한
함수를 만들어서 사용하고 있습니다.

random()버젼
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code_C_random_read2

/dev/random 버젼
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code_C_random_read

디스크 입출력을 강제로 발생시키는 루틴을 이용해서 -.-; 엔트로피 풀을 채우는
방법도 있겠지만 기분이 꿀꿀하죠 ?