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