Haruskah saya menggunakan /dev/random
atau /dev/urandom
?
Dalam situasi apa saya lebih memilih satu daripada yang lain?
Jawaban yang Diterima:
TL;DR
Gunakan /dev/urandom
untuk sebagian besar tujuan praktis.
Jawaban yang lebih panjang tergantung pada rasa Unix yang Anda jalankan.
Linux
Secara historis, /dev/random
dan /dev/urandom
diperkenalkan pada saat yang sama.
Seperti yang ditunjukkan @DavidSchwartz dalam komentar, menggunakan /dev/urandom
lebih disukai dalam sebagian besar kasus. Dia dan yang lainnya juga menyediakan tautan ke Mitos luar biasa tentang /dev/urandom
artikel yang saya rekomendasikan untuk dibaca lebih lanjut.
Singkatnya:
- Halaman manualnya menyesatkan.
- Keduanya diberi makan oleh sama CSPRNG untuk menghasilkan keacakan (diagram 2 dan 3)
/dev/random
blok ketika kehabisan entropi,
jadi baca dari/dev/random
dapat menghentikan eksekusi proses.- Jumlah entropi diperkirakan secara konservatif, tetapi tidak dihitung
/dev/urandom
tidak akan pernah memblokir.- Dalam kasus yang jarang terjadi, tak lama setelah boot, CSPRNG mungkin tidak memiliki cukup entropi untuk diunggulkan dengan benar dan
/dev/urandom
mungkin tidak menghasilkan keacakan berkualitas tinggi. - Entropi yang hampir habis tidak menjadi masalah jika CSPRNG awalnya diunggulkan dengan benar.
- CSPRNG terus-menerus diunggulkan kembali.
- Di Linux 4.8 dan seterusnya,
/dev/urandom
tidak menghabiskan kumpulan entropi (digunakan oleh/dev/random
) tetapi menggunakan keluaran CSPRNG dari hulu. - Gunakan
/dev/urandom
.
Pengecualian terhadap aturan
Di Cryptography Stack Exchange Kapan harus menggunakan /dev/random
lebih dari /dev/urandom
di Linux @otus memberikan dua kasus penggunaan:
-
Tak lama setelah boot pada perangkat dengan entropi rendah, jika entropi yang cukup belum dihasilkan untuk menyemai
/dev/urandom
dengan benar . -
Menghasilkan pad satu kali dengan keamanan teoretis informasi
Jika Anda khawatir tentang (1), Anda dapat memeriksa entropi yang tersedia di /dev/random
.
Jika Anda melakukannya (2) Anda akan mengetahuinya
Catatan:Anda dapat memeriksa apakah pembacaan dari /dev/random akan memblokir, tetapi waspadalah terhadap kemungkinan kondisi balapan.
Alternatif:jangan gunakan keduanya!
@otus juga menunjukkan bahwa getrandom()
sistem akan membaca dari /dev/urandom
dan hanya memblokir jika entropi benih awal tidak tersedia.
Ada masalah dengan mengubah /dev/urandom
untuk menggunakan getrandom()
, tetapi dapat dibayangkan bahwa /dev/xrandom
new baru perangkat dibuat berdasarkan getrandom()
.
macOS
Tidak masalah, seperti yang dikatakan Wikipedia:
macOS menggunakan Yarrow 160-bit berdasarkan SHA1. Tidak ada perbedaan antara /dev/random dan /dev/urandom; keduanya berperilaku identik. iOS Apple juga menggunakan Yarrow.
FreeBSD
Tidak masalah, seperti yang dikatakan Wikipedia:
/dev/urandom
hanyalah tautan ke/dev/random
dan hanya memblokir sampai diunggulkan dengan benar.
Ini berarti bahwa setelah boot, FreeBSD cukup pintar untuk menunggu sampai entropi benih yang cukup telah dikumpulkan sebelum memberikan aliran kebaikan acak yang tidak pernah berakhir.
Terkait:Linux – Bagaimana cara membuat Oracle Java 7 bekerja dengan setcap cap_net_bind_service+ep?NetBSD
Gunakan /dev/urandom
, dengan asumsi sistem Anda telah membaca setidaknya sekali dari /dev/random
untuk memastikan penyemaian awal yang tepat.
Halaman manual rnd(4) mengatakan:
/dev/urandom
tidak pernah memblokir.
/dev/random
terkadang blok. Akan memblokir lebih awal saat boot jika
status sistem diketahui dapat diprediksi.Aplikasi harus dibaca dari
/dev/urandom
ketika mereka membutuhkan
data yang dihasilkan secara acak, mis. kunci kriptografi atau seed untuk simulasi.Sistem harus direkayasa untuk secara bijaksana membaca setidaknya sekali dari
/dev/random
saat boot sebelum menjalankan layanan apa pun yang berbicara dengan
internet atau memerlukan kriptografi, untuk menghindari
menghasilkan kunci yang dapat diduga.