logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

Linux /dev/random vs /dev/urandom 삽질 후기

by 엉뚱도마뱀 posted Nov 22, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

난수를 발생시키기 위해서 여러 가지 방법을 사용하는데 몇몇 가지 대표적인 예를 들어 보죠.

1. ANSI C 라이브러리의 rand() 함수를 이용한다.
2. 외부 라이브러리가 (apr 이나, openssl 같은...) 가 제공하는 random 함수들을 이용한다
3. 디바이스 파일을 이용한다 (/dev/random, /dev/urandom)
4. PRNGd 같은 데몬을 이용한다.

여기서 삽질을 겪었던 방법이 3번입니다.

암호화를 위한 아파치 모듈을 하나 만들었는데, 모듈에서 종종 난수를 발생하기 위해서 apr (apache portable runtime library) 에 있는 apr_generate_random_bytes() 라는 함수를 콜하도록 했었고요.

스테이지 테스트까지는 별 문제가 없었는데, 라이브 서버에 올렸더니 일정 시간이 지나면.. apache 가 hang 걸린것 처럼 멈춰 버리는 현상이 발생을 하더군요.

strace 로 system call 을 모니터링 해봤는데, 


open("/dev/random", O_RDONLY) = 28
read(28, 0x37ef8824, 4) = ...


여기서 wating 을 하고 있는 것이 아닌가... 몇초도 아니고 몇십초를 대기하고 있었다. 대략 1~2분 정도를..
아파치 소스를 까봤더니 apr_generate_random_byte 내부에서 /dev/random 디바이스를 오픈해서 그냥 읽도록 되어 있었네 그랴.
근데 왜 /dev/random 을 읽다가 wating을 할까....???

man 에서 그 해답을 찾았습니다.

리눅스에서는 /dev/random 과 /dev/urandom 두개를 PRNG 디바이스로 제공을 하는데
방식은 IO 디바이스 드라이버에서 발생하는 입력 신호의 노이즈를 게더링 하여 비트수를 연산하여 난수를 발생시킨다고 하는군요.

/dev/random, /dev/urandom 두개의 차이점은 전자는 엔트로피(얼마나 고른 난수를 발생 시킬 수 있을지를 결정할 수 있는 값이라는군요)가 충분해 져야만 난수를 발생 시키기 때문에 보안에 강하지만 느리고요(심지어지는 엔트로피가 채워잴때까지 blocking 합니다.), 후자는 이 값이 충분하지 않아도 발생을 시키긴 하는데 보안에 취약하지만 빠릅니다.(엔트로피가 채워질때까지 blocking 하지 않습니다. 현재있는 앤트로피만 가지고 생성을 한답니다.)

여기서 보안에 강하다 취약하다는 말은.. 발생된 random 값으로 암호화 키를 생성하는데 사용할 경우, 이 키가 얼마나 깨기 어렵느냐 쉬우냐를 얘기합니다.

서버와 같은 머신에서는 PC 와는 다르게, 키보드나, 마우스와 같은 IO 디바이스가 별로 없기 때문에 일정한 수준의 앤트로피 풀을 만들어 내는데 많은 시간이 걸린다고 합니다.

그리고 /dev/random 은 머신 자체의 영향도 많이 받습니다. 라이브 서버가 5년 전에 들어온 리눅스 머신이었고 스테이지 서버가 들어온지 1년도 안된 새삥 머신이었죠.. /dev/random 에서 wating 하는 걸 두대에서 측정해 봤더니 스테이지 서버가 라이브 서버보다 상당히 빠르더군요..

그래서 결국은 apr 에서 제공하는 random 대신에 /dev/urandom 을 직접 오픈해서 읽는 걸로 바꾸었더니 행 걸리는 현상이 없이 잘 동작 하드랍니다.

참고로 FreeBSD 의 경우에는 /dev/random 은 Linux 의 /dev/urandom 과 같은 방식입니다.
FreeBSD 의 /dev 를 자세히보면 random 이 urandom 으로 symbolic link 가 걸려 있는걸 알 수 가 있습니다.


List of Articles
No. Subject Author Date Views
67 select 와 epoll 엉뚱도마뱀 2017.12.11 2
66 비밀번호 해쉬에 Salt(소금) 첨가하기 file 엉뚱도마뱀 2017.11.23 20
» Linux /dev/random vs /dev/urandom 삽질 후기 엉뚱도마뱀 2017.11.22 33
64 리눅스 /dev/random을 이용한 랜덤값 생성 엉뚱도마뱀 2017.11.22 16
63 난수발생기 개론 엉뚱도마뱀 2017.11.22 17
62 RSA 암호화 알고리즘 개요 file 엉뚱도마뱀 2017.11.17 22
61 악성코드 종류 구분 digipine 2017.11.13 53
60 대칭키 암호화관련 개념 정리 digipine 2017.11.09 32
59 Ubuntu 16 에 mysql 5.7 설치 및 원격 설정 file digipine 2017.11.08 26
58 Ubuntu 16 에 JAVA 1.7.0 jdk 설치 하기 digipine 2017.11.07 28
57 윈도우 한영 전환 쉬프트 스페이스로 변경 digipine 2017.11.03 8
56 우분투 Nabi 한글 입력기 Tray(트레이) 상단 메뉴바로 옮기기 digipine 2017.11.03 10
55 Ubuntu 12.0.4 LTS에 Nabi 나비 설치하기 digipine 2017.11.03 5
54 Linux init.d 에서 등록하기. 부팅 시 자동실행 설정 digipine 2017.11.03 6
53 초고속망 통신사 DNS 서버 주소 모음 - DNS 설정 digipine 2017.11.03 29
52 git 환경 설정 및 명령어 정리 digipine 2017.11.03 7
51 유닉스/리눅스 명령어 레퍼런스 digipine 2017.11.03 9
50 포렌식을 활용한 정보보호 digipine 2017.11.02 9
49 소프트웨어 테스팅 전문가들을 위한 사이트 digipine 2017.11.02 5
48 MacOS 10.12.2 (OSX) KERNEL DEBUGGING file digipine 2017.11.02 6
Board Pagination Prev 1 2 3 4 Next
/ 4