getrandom(2) - wariua/manpages-ko GitHub Wiki
getrandom - μΌλ ¨μ λμ λ°μ΄νΈ μ»κΈ°
#include <sys/random.h>
ssize_t getrandom(void *buf, size_t buflen, unsigned int flags);
getrandom()
μμ€ν
νΈμΆμ buf
κ° κ°λ¦¬ν€λ λ²νΌλ₯Ό buflen
κ°κΉμ§μ λμ λ°μ΄νΈλ€λ‘ μ±μ΄λ€. μ΄ λ°μ΄νΈλ€μ μ¬μ©μ κ³΅κ° λμ μμ±κΈ°μ μλλ‘ μ¬μ©νκ±°λ μνΈνμ μ©λμ μ¬μ©ν μ μλ€.
κΈ°λ³Έμ μΌλ‘ getrandom()
μ urandom
μμ²μΌλ‘λΆν° (μ¦ /dev/urandom
μ₯μΉμ κ°μ μμ²μΌλ‘λΆν°) μνΈλ‘νΌλ₯Ό λ½μλΈλ€. flags
μΈμλ₯Ό ν΅ν΄ μ΄ λμμ λ°κΏ μ μλ€.
urandom
μμ²μ΄ μ΄κΈ°ν λμ΄ μλ κ²½μ°μλ 256λ°μ΄νΈκΉμ§μ μ½κΈ°λ νμ μμ²ν λ§νΌμ λ°μ΄νΈλ₯Ό λ°ννλ©° μκ·Έλμ μν΄ μ€λ¨λμ§ μκ² λλ€. λ ν° λ²νΌ ν¬κΈ°μ λν΄μ κ·Έλ° λ³΄μ₯μ΄ μλ€. μλ₯Ό λ€μ΄ νΈμΆμ΄ μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λλ©΄ μΌλΆλ§ μ±μμ§ λ²νΌλ₯Ό λ°νν μλ μκ³ EINTR
μ€λ₯λ‘ μ€ν¨ν μλ μλ€.
urandom
μμ²μ΄ μμ§ μ΄κΈ°ν λμ΄ μμ§ μμ κ²½μ°μλ flags
μ GRND_NONBLOCK
μ μ§μ νμ§ μμμΌλ©΄ getrandom()
μ΄ λΈλ‘ νκ² λλ€.
flags
μΈμλ λΉνΈ λ§μ€ν¬μ΄λ©° λ€μ κ°λ€μ 0κ° λλ κ·Έ μ΄μ OR ν κ°μ λ΄μ μ μλ€.
GRND_RANDOM
- μ΄ λΉνΈκ° μ€μ λμ΄ μμΌλ©΄
urandom
μμ² λμrandom
μμ²μΌλ‘λΆν° (μ¦/dev/random
μ₯μΉμ κ°μ μμ²μΌλ‘λΆν°) λμ λ°μ΄νΈλ₯Ό λ½μλΈλ€.random
μμ²μ νκ²½ μ‘μμμ μ»μ μνΈλ‘νΌλ₯Ό κΈ°λ°μΌλ‘ νλλ‘ μ νλμ΄ μλ€.random
μμ² λ΄μ μ¬μ© κ°λ₯ν λ°μ΄νΈ μκ°buflen
μ μμ²ν κ°λ³΄λ€ μμΌλ©΄ μ¬μ© κ°λ₯ν λμ λ°μ΄νΈλ€λ§ λ°ννλ€. μ¬μ© κ°λ₯ν λμ λ°μ΄νΈκ° μλ κ²½μ°μ λμ λ°©μμflags
μΈμμGRND_NONBLOCK
μ΄ μλμ§ μ¬λΆμ λ°λΌ λ€λ₯΄λ€. GRND_NONBLOCK
- κΈ°λ³Έμ μΌλ‘
getrandom()
μ΄random
μμ²μΌλ‘λΆν° μ½μ΄λ€μΌ λ μ¬μ© κ°λ₯ν λμ λ°μ΄νΈκ° μμΌλ©΄ λΈλ‘ νλ©°,urandom
μμ²μΌλ‘λΆν° μ½μ΄λ€μΌ λ μνΈλ‘νΌ νμ΄ μμ§ μ΄κΈ°ν λμ§ μμμΌλ©΄ λΈλ‘ νλ€.GRND_NONBLOCK
νλκ·Έλ₯Ό μ€μ νλ©΄ μ΄λ° κ²½μ°μgetrandom()
μ΄ λΈλ‘ νμ§ μκ³ μ¦μ -1μ λ°ννλ©°errno
λ₯ΌEAGAIN
μΌλ‘ μ€μ νλ€.
μ±κ³΅ μ getrandom()
μ λ²νΌ buf
λ‘ λ³΅μ¬λ λ°μ΄νΈ μλ₯Ό λ°ννλ€. flags
μ GRND_RANDOM
μ μ§μ νλλ° random
μμ²μ μΆ©λΆν μνΈλ‘νΌκ° μμ§ μμκ±°λ μμ€ν
νΈμΆμ΄ μκ·Έλμ μν΄ μ€λ¨λμλ€λ©΄ μ΄ κ°μ΄ buflen
μ ν΅ν΄ μμ²ν λ°μ΄νΈ μλ³΄λ€ μμ μλ μλ€.
μ€λ₯ μ -1μ λ°ννλ©° errno
λ₯Ό μ μ ν μ€μ νλ€.
EAGAIN
- μμ²ν λ§νΌμ μνΈλ‘νΌκ° μ¬μ© κ°λ₯νμ§ μμμΌλ©°
GRND_NONBLOCK
μ μ€μ νμ§ μμλ€λ©΄getrandom()
μ΄ λΈλ‘ νμ κ²μ΄λ€. EFAULT
-
buf
κ° κ°λ¦¬ν€λ μ£Όμκ° μ κ·Ό κ°λ₯ν μ£Όμ κ³΅κ° λ°μ μλ€. EINTR
- νΈμΆμ΄ μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λμλ€. signal(7) 맨 νμ΄μ§μμ
SA_RESTART
νλκ·Έκ° μκ±°λ μμ λ "λλ¦°" μ₯μΉμ λνread(2)
νΈμΆ μ€λ¨μ μ΄λ»κ² μ²λ¦¬νλμ§μ λν μ€λͺ μ 보λΌ. EINVAL
-
flags
μ μ ν¨νμ§ μμ νλκ·Έλ₯Ό μ§μ νλ€. ENOSYS
-
getrandom()
μ glibc λνΌ ν¨μμμ κΈ°λ° μ»€λμ΄ μ΄ μμ€ν νΈμΆμ ꡬννκ³ μμ§ μλ€κ³ νλ¨νλ€.
리λ
μ€ μ»€λ λ²μ 3.17μμ getrandom()
μ΄ λμ
λμλ€. glibc λ²μ 2.25μμ μ§μμ΄ μΆκ°λμλ€.
μ΄ μμ€ν νΈμΆμ 리λ μ€ μ μ©μ΄λ€.
λμλ₯Ό μ»λ λ° μ¬μ©ν μ μλ λ€μν μΈν°νμ΄μ€λ€μ μκ°μ λΉκ΅λ random(7)μ 보λΌ.
/dev/random
λ° /dev/urandom
κ³Ό λ¬λ¦¬ getrandom()
μλ κ²½λ‘λͺ
μ΄λ νμΌ λμ€ν¬λ¦½ν° μ¬μ©μ΄ μλ°λμ§ μλλ€. λ°λΌμ chroot(2) λλ¬Έμ /dev
κ²½λ‘λͺ
μ΄ λ³΄μ΄μ§ μκ² λλ κ²½μ°λ λΌμ΄λΈλ¬λ¦¬μμ μ΄ νμΌλ€ μ€ νλλ₯Ό μ° νμΌ λμ€ν¬λ¦½ν°λ₯Ό μμ©μ΄ (κ°λ Ή λ°λͺ¬μ΄ κ°μ κ³Όμ μ€μ) λ«λ κ²½μ°μ getrandom()
μ΄ μ μ©ν μ μλ€.
리λ μ€ 3.19 νμ¬ λ€μ μ νμ΄ μ μ©λλ€.
-
urandom
μμ²μΌλ‘λΆν° μ½μ΄λ€μΌ λint
μ ν¬κΈ°κ° 32λΉνΈμΈ μμ€ν μμgetrandom()
νΈμΆ ν λ²μ΄ μ΅λ 33554431λ°μ΄νΈλ₯Ό λ°ννλ€. -
random
μμ²μΌλ‘λΆν° μ½μ΄λ€μΌ λ μ΅λ 512λ°μ΄νΈλ₯Ό λ°ννλ€.
urandom
μμ²μΌλ‘λΆν° μ½μ΄λ€μΌ λ (GRND_RANDOM
μ΄ μ€μ λμ΄ μμ§ μμ λ) getrandom()
μ (GRND_NONBLOCK
νλκ·Έλ₯Ό μ§μ νμ§ μμλ€λ©΄) μνΈλ‘νΌ νμ΄ μ΄κΈ°ν λ λκΉμ§ λΈλ‘ νκ² λλ€. λ§μ μμ (256 λλ) λ°μ΄νΈλ₯Ό μ½λλ‘ μμ²νλ©΄ κ·Έ λ°μ΄νΈλ€μ μμ±νμ¬ μ»€λ λ©λͺ¨λ¦¬μμ buf
λ‘ λ³΅μ¬ν λκΉμ§ getrandom()
μ΄ λΈλ‘ νκ² λλ€. random
μμ²μΌλ‘λΆν° μ½μ΄λ€μΌ λ (GRND_RANDOM
μ΄ μ€μ λμ΄ μμ λ) getrandom()
μ (GRND_NONBLOCK
νλκ·Έλ₯Ό μ§μ νμ§ μμλ€λ©΄) μ¬μ© κ°λ₯ν λμ λ°μ΄νΈκ° μκ² λ λκΉμ§ λΈλ‘ νκ² λλ€.
urandom
μμ²μΌλ‘λΆν° μ½κ³ μλ λμ λΈλ‘ λ getrandom()
νΈμΆμ΄ μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λμμ λμ λμ λ°©μμ μνΈλ‘νΌ λ²νΌμ μ΅μ΄ μνμ μμ² ν¬κΈ°μΈ buflen
μ λ°λΌ λ¬λΌμ§λ€. μμ§ μνΈλ‘νΌκ° μ΄κΈ°ν λμ§ μμμΌλ©΄ EINTR
μ€λ₯λ‘ νΈμΆμ΄ μ€ν¨νλ€. μνΈλ‘νΌ νμ΄ μ΄κΈ°ν λμμΌλ©° μμ² ν¬κΈ°κ° ν¬λ©΄ (buflen
> 256) νΈμΆμ΄ μΌλΆλ§ μ±μμ§ λ²νΌλ₯Ό λ°ννλ©° μ±κ³΅νκ±°λ EINTR
μ€λ₯λ‘ μ€ν¨νλ€. μνΈλ‘νΌ νμ΄ μ΄κΈ°ν λμμΌλ©° μμ² ν¬κΈ°κ° μμΌλ©΄ (buflen
<= 256) getrandom()
μ΄ EINTR
λ‘ μ€ν¨νμ§ μκ² λλ€. μμ² λ°μ λ§νΌμ λ°μ΄νΈλ₯Ό λͺ¨λ λ°ννκ² λλ€.
random
μμ²μΌλ‘λΆν° μ½κ³ μλ μ€μ μμ ν¬κΈ°μ λΈλ‘νΉ μμ²μ΄ μκ·Έλ νΈλ€λ¬μ μν΄ μ€λ¨λ μ μλ€. (νΈμΆμ΄ EINTR
μ€λ₯λ‘ μ€ν¨νλ€.)
urandom
μμ²μΌλ‘λΆν° μμ (<= 256λ°μ΄νΈ) λ²νΌλ₯Ό μ½μ΄λ€μ΄λ κ²μ΄ getrandom()
μ μ νΈ μ¬μ© λ°©μμ΄λ€.
μμ buflen
κ°μ λν νΉλ³ν μ²λ¦¬λ μμ¦ glibcμμλ μ§μνλ OpenBSDμ getentropy(3)μμ νΈνμ±μ μν΄ μ€κ³λ κ²μ΄λ€.
getrandom()
μ¬μ©μλ μΈμ λ λ°ν κ°μ νμΈνμ¬ μ€λ₯κ° λ°μνκ±°λ μμ²λ³΄λ€ μ μ λ°μ΄νΈκ° λ°νλμλμ§ νλ¨ν΄μΌ νλ€. GRND_RANDOM
μ μ§μ νμ§ μμκ³ buflen
κ° 256 μ΄νμΈ κ²½μ°μλ μμ²λ³΄λ€ μ μ λ°μ΄νΈκ° λ°νλλ κ²½μ°κ° μ λ μμ ν
μ§λ§ μΈμ¬ν νλ‘κ·Έλλ¨ΈλΌλ©΄ κ·Έλλ νμΈν κ²μ΄λ€!
리λ μ€ 3.19 νμ¬ λ€μ λ²κ·Έκ° μ‘΄μ¬νλ€.
- CPU λΆνμ λ°λΌ
getrandom()
μ΄ μμ²ν λ°μ΄νΈ λͺ¨λλ₯Ό μ½κΈ° μ κΉμ§ μκ·Έλμ λ°μνμ§ μλλ€.
getentropy(3), random(4), urandom(4), random(7), signal(7)
2017-09-15