random(4) - wariua/manpages-ko GitHub Wiki
random, urandom - 컀λ λμ μμ² μ₯μΉ
#include <linux/random.h>
int ioctl(fd, RNDrequest, param);
(리λ
μ€ 1.3.30λΆν° μ‘΄μ¬νλ) λ¬Έμ νΉμ νμΌ /dev/random
κ³Ό /dev/urandom
μ 컀λμ λμ μμ±κΈ°μ λν μΈν°νμ΄μ€λ₯Ό μ 곡νλ€. /dev/random
νμΌμ μ₯μΉ μ£Όλ²νΈκ° 1μ΄κ³ μ₯μΉ λΆλ²νΈκ° 8μ΄λ€. /dev/urandom
νμΌμ μ₯μΉ μ£Όλ²νΈκ° 1μ΄κ³ μ₯μΉ λΆλ²νΈκ° 9μ΄λ€.
λμ μμ±κΈ°λ μ₯μΉ λλΌμ΄λ² λ° κΈ°ν μμ²λ€λ‘λΆν° νκ²½ μ‘μμ μμ§νμ¬ μνΈλ‘νΌ νμ λ£λλ€. μμ±κΈ°λ λν μνΈλ‘νΌ ν λ΄μ μ‘μ λΉνΈ μ μΆμ μΉλ₯Ό μ μ§νλ€. μ΄ μνΈλ‘νΌ νλ‘λΆν° λμλ€μ μμ±νλ€.
리λ μ€ 3.17 λ° μ΄ν λ²μ μμλ λ λ¨μνκ³ μμ ν getrandom(2) μΈν°νμ΄μ€λ₯Ό μ 곡νλ€. μ¬κΈ°μλ μ΄λ€ νΉμ νμΌλ νμνμ§ μλ€. μμΈν λ΄μ©μ getrandom(2) λ§€λ΄μΌ νμ΄μ§λ₯Ό 보λΌ.
/dev/urandom
μ₯μΉλ₯Ό μ½μ΄λ€μ΄λ©΄ μνΈλ‘νΌ νμ μλλ‘ μ°λ μ μ¬ λμ μμ±κΈ°λ₯Ό μ΄μ©νμ¬ λμ λ°μ΄νΈλ₯Ό λ°ννλ€. μ΄ μ₯μΉλ₯Ό μ½λ κ²μ λΈλ‘ νμ§ μλλ€. (μ¦, CPUλ₯Ό μ보νμ§ μλλ€.) νμ§λ§ λ§μ μμ λ°μ΄ν°λ₯Ό μμ²ν λμλ μ£Όλͺ©ν λ§ν μ§μ°μ΄ λ°μν μ μλ€.
λΆν
μ΄λ°μλ μνΈλ‘νΌ νμ΄ μ΄κΈ°ν λκΈ° μ μ /dev/urandom
μ΄ λ°μ΄ν°λ₯Ό λ°νν μλ μλ€. μμ©μμ μ΄ μ μ΄ μΌλ €λλ€λ©΄ λμ getrandom(2)μ΄λ /dev/random
μ μ¬μ©νλΌ.
/dev/random
μ₯μΉλ /dev/urandom
ꡬνμ μ°λ μνΈνμ μμλ₯Ό λ리 μ λ’°νμ§ μλ μκΈ°κΉμ§ κ±°μ¬λ¬ μ¬λΌκ°λ ꡬμ μΈν°νμ΄μ€μ΄λ€. μνΈλ‘νΌ ν λ΄μ μ μ ν μ‘μ λΉνΈ μΆμ λ λ΄μμλ§ λμ λ°μ΄νΈλ₯Ό λ°ννκ² λλ©° νμνλ©΄ λΈλ‘ νλ€. /dev/random
μ νμ§ λμ λμμ±μ΄ νμνλ©΄μ λΆνμ ν μ§μ°μ κ°μν μ μλ μμ©λ€μ μ ν©νλ€.
μνΈλ‘νΌ νμ΄ λΉμ΄ μμ λ /dev/random
μ μ½μΌλ©΄ μΆκ°λ‘ νκ²½ μ‘μμ μμ§ν λκΉμ§ λΈλ‘ νκ² λλ€. /dev/random
μ λν open(2)μ O_NONBLOCK
νλκ·Έμ ν¨κ» νΈμΆνλ©΄ νμ read(2)
μμ μμ²ν μλ§νΌμ λ°μ΄νΈκ° μ¬μ© κ°λ₯νμ§ μμ κ²½μ°μ λΈλ‘ νμ§ μκ² λλ€. λμ μ¬μ© κ°λ₯ν λ°μ΄νΈλ€μ λ°ννλ€. μ¬μ© κ°λ₯ν λ°μ΄νΈκ° μμΌλ©΄ read(2)
κ° -1μ λ°ννλ©° errno
λ₯Ό EAGAIN
μΌλ‘ μ€μ νκ² λλ€.
/dev/urandom
μ μ΄ λλ O_NONBLOCK
νλκ·Έμ ν¨κ³Όκ° μλ€. /dev/urandom
μ₯μΉμ read(2)
λ₯Ό νΈμΆν λ 256κ°κΉμ§μ λ°μ΄νΈλ₯Ό μ½μΌλ©΄ μμ²ν λ§νΌμ λ°μ΄νΈλ€μ λ°ννλ©° μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λμ§ μκ² λλ€. μ΄ μ νμ λλ λ²νΌλ‘ μ½κΈ°λ₯Ό νλ©΄ μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λλ κ²½μ° μμ²ν λ°μ΄νΈ μλ³΄λ€ μ κ² λ°ννκ±°λ EINTR
μ€λ₯λ‘ μ€ν¨ν μλ μλ€.
리λ
μ€ 3.16λΆν°λ /dev/urandom
μμ read(2)
νλ κ²μ΄ μ΅λ 32MBλ₯Ό λ°ννκ² λλ€. /dev/random
μμ read(2)
νλ κ²μ μ΅λ 512λ°μ΄νΈλ₯Ό (리λ
μ€ μ»€λ λ²μ 2.6.12 μ μμλ 340λ°μ΄νΈλ₯Ό) λ°ννκ² λλ€.
/dev/random
μ΄λ /dev/urandom
μ μ°κΈ°λ₯Ό νλ©΄ μ¨λ£μ λ°μ΄ν°λ‘ μνΈλ‘νΌ νμ κ°±μ νκ² λμ§λ§ μνΈλ‘νΌ μμ΄ μ¬λΌκ°μ§λ μλλ€. μ¦, λ νμΌμμ μ½κ² λλ λ΄μ©λ¬Όμλ μν₯μ μ£Όμ§λ§ /dev/random
μμ μ½λ κ²μ΄ λ λΉ¨λΌμ§μ§λ μλλ€.
/dev/random
μΈν°νμ΄μ€λ ꡬμ μΈν°νμ΄μ€λ‘ λ³Έλ€. λͺ¨λ μ©λμ /dev/urandom
μ΄ μ’κ³ λ μΆ©λΆνλ€. μ΄μ λν μμΈκ° λΆν
μ΄κΈ° λμ λμμ±μ΄ νμν μμ©λ€μΈλ°, κ·Έλ° μμ©λ€μμλ λμ getrandom(2)μ μ¬μ©ν΄μΌ νλ€. κ·Έ ν¨μλ μνΈλ‘νΌ νμ΄ μ΄κΈ°ν λ λκΉμ§ λΈλ‘ νκ² λλ€.
μλμμ κΆμ₯νλ― μ¬λΆν
μ κ±°μΉ λ μλ νμΌμ μ μ₯νλ©΄ (μ΅μ 2000λ
λΆν° λͺ¨λ μ£Όμ 리λ
μ€ λ°°ν¬νλ€μ΄ μ΄λ κ² νλ€.) λΆν
κ³Όμ μμ μ¬μ μ¬νλ μ¦μ λ‘컬 λ£¨νΈ μ κ·ΌκΆ μλ 곡격μμ λν΄ μΆλ ₯μ΄ μνΈνμ μΌλ‘ μμ ν΄μ§λ€. λ€νΈμν¬ μνΈν μΈμ
ν€μ λν λ° μμ΄ μ ν©νλ€. /dev/random
μ½κΈ°κ° λΈλ‘ ν μλ μμΌλ―λ‘ μΌλ°μ μΌλ‘ μ¬μ©μλ λ
ΌλΈλ‘νΉ λͺ¨λλ‘ μ΄κ³ μ (λλ νμμμμ μ£Όμ΄ μ½κΈ°λ₯Ό μννκ³ μ) μνλ μνΈλ‘νΌκ° μ¦μ μ¬μ© κ°λ₯νμ§ μμΌλ©΄ μ΄λ€ μ’
λ₯μ μ¬μ©μ μλ¦Όμ μ 곡νκΈ°λ₯Ό λ°λ κ²μ΄λ€.
μμ€ν
μ /dev/random
λ° /dev/urandom
μ΄ μ΄λ―Έ μμ±λμ΄ μμ§ μλ€λ©΄ λ€μ λͺ
λ ΉμΌλ‘ μμ±ν μ μλ€.
mknod -m 666 /dev/random c 1 8
mknod -m 666 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom
μ΄μ©μμμ μνΈμμ©μ΄ ν¬κ² μμ΄ λ¦¬λ μ€ μμ€ν μ΄ μμν λλ μνΈλ‘νΌ νμ΄ κ½€ μμΈ‘ κ°λ₯ν μνμΌ μλ μλ€. μ΄λ κ² λλ©΄ μνΈλ‘νΌ ν λ΄μ μ€μ μ‘μ μμ΄ μΆμ°μΉλ³΄λ€ λ΄λ €κ°λ€. μ΄ ν¨κ³Όμ λμνλ €λ©΄ μμ€ν μ μ§μ μμμ κ±Έμ³μ μνΈλ‘νΌ ν μ λ³΄κ° μ΄μ΄μ§κ² νλ κ²μ΄ λμμ΄ λλ€. 리λ μ€ μμ€ν μμ κ³Όμ μ μ€νλλ μ μ ν μ€ν¬λ¦½νΈμ λ€μ νλ€μ μΆκ°νλ©΄ λλ€.
echo "Initializing random number generator..."
random_seed=/var/run/random-seed
# μμμμ μμμΌλ‘ λμ μλ μ΄μνκΈ°
# μνΈλ‘νΌ ν μ 체λ₯Ό μ μ¬ν λ€μ μ μ₯
if [ -f $random_seed ]; then
cat $random_seed >/dev/urandom
else
touch $random_seed
fi
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
bytes=$(expr $bits / 8)
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
κ·Έλ¦¬κ³ λ¦¬λ μ€ μμ€ν μ μ§ κ³Όμ μ μ€νλλ μ μ ν μ€ν¬λ¦½νΈμ λ€μ νλ€μ μΆκ°νλ©΄ λλ€.
# μ μ§μμ μμμΌλ‘ λμ μλ μ΄μνκΈ°
# μνΈλ‘νΌ ν μ 체λ₯Ό μ μ₯
echo "Saving random seed..."
random_seed=/var/run/random-seed
touch $random_seed
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
bytes=$(expr $bits / 8)
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
μ μμλ€μμλ 리λ
μ€ 2.6.0 λ΄μ§ μ΄ν λ²μ μ κ°μ νλ€. κ·Έ λ²μ λ€μμλ /proc/sys/kernel/random/poolsize
μ΄ μνΈλ‘νΌ νμ ν¬κΈ°λ₯Ό λΉνΈ λ¨μλ‘ λ°ννλ€ (μλ μ°Έκ³ ).
(2.3.16λΆν° μλ) /proc/sys/kernel/random
λλ ν°λ¦¬ λ΄μ νμΌλ€μ΄ /dev/random
μ₯μΉμ λν μΆκ° μ 보λ₯Ό μ 곡νλ€.
entropy_avail
- μ΄ μ½κΈ° μ μ© νμΌμ μ¬μ© κ°λ₯ μνΈλ‘νΌμ μμ λΉνΈ λ¨μλ‘ μλ € μ€λ€. 0μμ 4096κΉμ§ λ²μμ μ«μμΌ κ²μ΄λ€.
poolsize
-
μ΄ νμΌμ μνΈλ‘νΌ νμ ν¬κΈ°λ₯Ό μλ € μ€λ€. 컀λ λ²μ μ λ°λΌ μ΄ νμΌμ ν΄μ λ°©μμ΄ λ€λ₯΄λ€.
- 리λ μ€ 2.4:
- μ΄ νμΌμ λ°μ΄νΈ λ¨μλ‘ μνΈλ‘νΌ νμ ν¬κΈ°λ₯Ό μλ € μ€λ€. 보ν΅μ 512 κ°μ κ°μ§κ² λλλ°, νμΌμ΄ μ°κΈ° κ°λ₯νλ―λ‘ κ°μ© μκ³ λ¦¬λ¬μ΄ μλ μ΄λ€ κ°μΌλ‘λ λ°κΏ μ μλ€. μ ν κ°λ₯ν κ°μ 32, 64, 128, 256, 512, 1024, 2048μ΄λ€.
- 리λ μ€ 2.6 λ° μ΄ν:
- μ΄ νμΌμ μ½κΈ° μ μ©μ΄λ©° λΉνΈ λ¨μλ‘ μνΈλ‘νΌ νμ ν¬κΈ°λ₯Ό μλ € μ€λ€. 4096 κ°μ λ΄κ³ μλ€.
read_wakeup_threshold
- μ΄ νμΌμ
/dev/random
μκ²μ μνΈλ‘νΌλ₯Ό κΈ°λ€λ¦¬λ©° μ λ€μ΄ μλ νλ‘μΈμ€λ€μ κΉ¨μ°κΈ° μν΄ νμν μνΈλ‘νΌ λΉνΈ μλ₯Ό λ΄κ³ μλ€. κΈ°λ³Έκ°μ 64μ΄λ€. write_wakeup_threshold
- μ΄ νμΌμ
/dev/random
μ°κΈ° μ κ·Όμ select(2) λ΄μ§ poll(2) νλ νλ‘μΈμ€λ€μ κΉ¨μ°λ μνΈλ‘νΌ λΉνΈ μ κΈ°μ€μ λ΄κ³ μλ€. μ΄ κΈ°μ€ μλμ΄λ©΄ κΉ¨μ΄λ€. νμΌμ μ°κΈ°λ₯Ό ν΄μ μ΄ κ°λ€μ λ°κΏ μ μλ€. -
uuid
λ°boot_id
- μ΄ μ½κΈ° μ μ© νμΌλ€μ 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9 κ°μ λμμ΄μ λ΄κ³ μλ€. μ μλ μ½μ λλ§λ€ μλ‘ μμ±νλ©° νμλ ν λ²λ§ μμ±νλ€.
/dev/random
λ΄μ§ /dev/urandom
μ μ°κ²°λ νμΌ λμ€ν¬λ¦½ν°μμ λ€μ ioctl(2)
μμ²λ€μ΄ μ μλμ΄ μλ€. λͺ¨λ μν μμ²λ€μ /dev/random
κ³Ό /dev/urandom
λͺ¨λμ μν₯μ μ£Όλ μ
λ ₯ μνΈλ‘νΌ νκ³Ό μνΈμμ© νκ² λλ€. RNDGETENTCNT
λ₯Ό μ μΈν λͺ¨λ μμ²μλ CAP_SYS_ADMIN
μλ₯μ΄ νμνλ€.
RNDGETENTCNT
-
μ
λ ₯ νμ μνΈλ‘νΌ μμ κ°μ Έμ¨λ€. κ·Έ λ΄μ©λ¬Όμ proc μλμ
entropy_avail
κ³Ό κ°κ² λλ€. μΈμκ° κ°λ¦¬ν€λ intμ κ²°κ³Όκ° μ μ₯λλ€. RNDADDTOENDCNT
- μΈμκ° κ°λ¦¬ν€λ κ°λ§νΌ μ λ ₯ νμ μνΈλ‘νΌ μμ μ¬λ¦¬κ±°λ λ΄λ¦°λ€.
RNDGETPOOL
- 리λ μ€ 2.6.9μμ μ κ±°λ¨.
RNDADDENTROPY
-
μ λ ₯ νμ μ΄λ€ μΆκ° μνΈλ‘νΌλ₯Ό λνμ¬ μνΈλ‘νΌ μμ λμΈλ€.
/dev/random
μ΄λ/dev/urandom
μ μ°κΈ°λ₯Ό νλ κ²κ³Όλ λ€λ₯Έλ°, κ±°κΈ°μ μ΄λ€ λ°μ΄ν°λ₯Ό μΆκ°νμ§λ§ μνΈλ‘νΌ μμ λμ΄μ§λ μλλ€. λ€μ ꡬ쑰체λ₯Ό μ¬μ©νλ€.struct rand_pool_info { int entropy_count; int buf_size; __u32 buf[0]; };
μ¬κΈ°μ
entropy_count
λ μνΈλ‘νΌ μμ λνλ (λλ λΉΌλ) κ°μ΄κ³ ,buf
λ μνΈλ‘νΌ νμ μΆκ°λλbuf_size
ν¬κΈ° λ²νΌμ΄λ€. -
RNDZAPENTCNT
,RNDCLEARPOOL
- λͺ¨λ νμ μνΈλ‘νΌ μμ 0μΌλ‘ λ§λ€κ³ κ·Έ νλ€μ μ΄λ€ (μκ³ μκ° κ°μ) μμ€ν λ°μ΄ν°λ₯Ό μΆκ°νλ€.
/dev/random
/dev/urandom
λμλ₯Ό μ»λ λ° μ¬μ©ν μ μλ λ€μν μΈν°νμ΄μ€λ€μ μκ°μ λΉκ΅λ random(7)μ 보λΌ.
λΆν
μ΄λ°μλ μνΈλ‘νΌ νμ΄ μ΄κΈ°ν λκΈ° μ μ /dev/urandom
μ½κΈ°κ° λ°μ΄ν°λ₯Ό λ°νν μλ μλ€.
mknod(1)
, getrandom(2), random(7)
RFC 1750, "보μμ μν λμμ± μꡬ μ¬ν"
2017-09-15