Haruskah saya menggunakan /dev/random
atau /dev/urandom
?
Dalam situasi apa saya lebih suka yang satu daripada yang lain?
Haruskah saya menggunakan /dev/random
atau /dev/urandom
?
Dalam situasi apa saya lebih suka yang satu daripada yang lain?
Jawaban:
Gunakan /dev/urandom
untuk tujuan paling praktis.
Jawaban yang lebih lama tergantung pada rasa Unix yang Anda jalankan.
Secara historis, /dev/random
dan /dev/urandom
keduanya diperkenalkan pada saat yang sama.
Seperti @DavidSchwartz tunjukkan dalam komentar , penggunaan /dev/urandom
lebih disukai di sebagian besar kasus. Dia dan yang lainnya juga memberikan tautan ke Mitos-Mitos/dev/urandom
luar biasa tentang artikel yang saya rekomendasikan untuk dibaca lebih lanjut.
Singkatnya:
/dev/random
blok ketika kehabisan entropi/dev/urandom
tidak akan pernah memblokir, membaca dari /dev/random
dapat menghentikan proses eksekusi./dev/urandom
mungkin tidak menghasilkan keacakan berkualitas tinggi./dev/urandom
tidak menguras kumpulan entropi (digunakan oleh /dev/random
) tetapi menggunakan output CSPRNG dari hulu./dev/urandom
.Pengecualian terhadap aturan
Dalam Kriptografi Stack Exchange Kapan menggunakan /dev/random
lebih /dev/urandom
di Linux
@otus memberikan dua kasus penggunaan :
Segera setelah boot pada perangkat entropi rendah, jika cukup entropi belum dihasilkan untuk diunggulkan dengan benar /dev/urandom
.
Jika Anda khawatir tentang (1), Anda dapat memeriksa entropi yang tersedia di/dev/random
.
Jika Anda melakukan (2) Anda sudah mengetahuinya :)
Catatan: Anda dapat memeriksa apakah membaca dari / dev / random akan memblokir , tetapi waspadalah terhadap kemungkinan kondisi balapan.
Alternatif: jangan gunakan!
@otus juga menunjukkan bahwa getrandom()
sistem akan membaca dari /dev/urandom
dan hanya memblokir jika entropi benih awal tidak tersedia.
Ada masalah dengan perubahan /dev/urandom
untuk digunakangetrandom()
, tetapi dapat dibayangkan bahwa /dev/xrandom
perangkat baru dibuat berdasarkan getrandom()
.
Tidak masalah, seperti yang dikatakan Wikipedia :
macOS menggunakan 160-bit Yarrow berdasarkan SHA1. Tidak ada perbedaan antara / dev / random dan / dev / urandom; keduanya berperilaku identik. IOS Apple juga menggunakan Yarrow.
Tidak masalah, seperti yang dikatakan Wikipedia :
/dev/urandom
hanyalah tautan ke/dev/random
dan hanya blok sampai diunggulkan dengan benar.
Ini berarti bahwa setelah boot, FreeBSD cukup pintar untuk menunggu sampai cukup banyak entropi benih dikumpulkan sebelum memberikan aliran kebaikan acak yang tidak pernah berakhir.
Gunakan /dev/urandom
, dengan asumsi sistem Anda telah membaca setidaknya sekali /dev/random
untuk memastikan penyemaian awal yang tepat.
The rnd (4) manualnya mengatakan :
/dev/urandom
Jangan pernah menghalangi.
/dev/random
Terkadang memblok. Akan memblokir lebih awal saat boot jika kondisi sistem diketahui dapat diprediksi.Aplikasi harus membaca dari / dev / urandom ketika mereka membutuhkan data yang dihasilkan secara acak, misalnya kunci kriptografi atau benih untuk simulasi.
Sistem harus direkayasa untuk secara bijaksana membaca setidaknya sekali dari / dev / random saat boot sebelum menjalankan layanan apa pun yang berbicara ke internet atau sebaliknya memerlukan kriptografi, untuk menghindari pembuatan kunci yang dapat diprediksi.
/dev/urandom
- Kecuali tidak ada yang namanya /dev/urandom
pada OpenBSD. OpenBSD memiliki /dev/arandom
, tetapi Anda tidak seharusnya menggunakannya, Anda harus menggunakan arc4random(3)
fungsinya. Mungkin saran tentang perangkat dan fungsi acak harus diserahkan kepada orang-orang yang benar-benar mengerti tentang apa semua itu?
/dev/random
blok ketika kehabisan entropi" - Di Linux, itu tergantung bagaimana Anda membuka perangkat. Jika open
bendera termasuk O_NONBLOCK
maka itu tidak akan diblokir. Jika tidak ada entropi maka panggilan akan segera kembali dan menunjukkan 0 byte dibaca.
/dev/random
hanya (ex :) 60 byte, dd
akan memberi Anda file 60 byte. Menggunakan head
dalam skenario yang sama mungkin akan terlihat seperti menggantung selamanya. Baik melakukan apa yang Anda inginkan, tetapi, setidaknya bagi saya, lebih jelas bahwa head
tidak melakukan apa yang diharapkan.
Secara tradisional, satu-satunya perbedaan antara /dev/urandom
dan /dev/random
apa yang terjadi ketika kernel berpikir tidak ada entropi dalam sistem - /dev/random
gagal ditutup, /dev/urandom
gagal terbuka. Kedua pembalap itu sumber entropi dari add_disk_randomness()
, add_interrupt_randomness()
, dan add_input_randomness()
. Lihat /drivers/char/random.c
secara spesifik.
Diedit untuk menambahkan: Pada Linux 4.8 /dev/urandom
sedang dikerjakan ulang untuk menggunakan CSPRNG.
Jadi kapan Anda gagal ditutup? Untuk segala jenis penggunaan kriptografi, khususnya penyemaian DRBG. Ada makalah yang sangat bagus yang menjelaskan konsekuensi dari penggunaan /dev/urandom
saat membuat kunci RSA dan tidak memiliki cukup entropi. Baca Menambang Ps dan Qs Anda .
Ini semacam jawaban "saya juga", tetapi itu memperkuat rekomendasi Tom Hale. Ini berlaku untuk Linux.
/dev/urandom
/dev/random
Menurut Theodore Ts'o di milis Linux Kernel Crypto, /dev/random
telah ditinggalkan selama satu dekade. Dari Re: [RFC PATCH v12 3/4] Linux Random Number Generator :
Praktis tidak ada yang menggunakan / dev / acak. Ini pada dasarnya antarmuka yang sudah usang; antarmuka utama yang telah direkomendasikan selama lebih dari satu dekade adalah / dev / urandom, dan sekarang, getrandom (2).
Kami secara teratur menguji /dev/random
dan sering mengalami kegagalan. Tes melakukan tiga langkah: (1) tiriskan /dev/random
dengan meminta 10K byte dalam mode non-blocking; (2) meminta 16 byte dalam mode pemblokiran (3) mencoba untuk mengompresi blok untuk melihat apakah itu acak (tes orang miskin). Tes ini memakan waktu beberapa menit untuk selesai.
Masalahnya sangat buruk pada sistem Debain (i686, x86_64, ARM, dan MIPS) kami meminta GCC Compile Farm untuk menginstal rng-tools
paket untuk mesin uji mereka. Dari Instal rng-tools di gcc67 dan gcc68 :
Saya ingin meminta agar rng-tools diinstal pada gcc67 dan gcc68. Mereka adalah sistem Debian, dan / dev / acak menderita penipisan entropi tanpa rng-tools ketika menyiksa pustaka pengujian yang menggunakan perangkat.
BSD dan OS X tampak OK. Masalahnya pasti Linux.
Mungkin juga layak disebutkan bahwa Linux tidak mencatat kegagalan generator. Mereka tidak ingin entri mengisi log sistem. Sampai saat ini, sebagian besar kegagalan hanya diam dan tidak terdeteksi oleh sebagian besar pengguna.
Situasi harus berubah segera karena kernel akan mencetak setidaknya satu pesan kegagalan. Dari [PATCH] acak: peringatan kompiler senyap dan perbaiki ras pada milis kernel crypto:
Secara khusus, saya menambahkan
depends on DEBUG_KERNEL
. Ini berarti bahwa peringatan yang berguna ini hanya akan menyodok pengembang kernel lain. Ini mungkin persis yang kita inginkan. Jika berbagai pengembang terkait melihat peringatan datang dari subsistem khusus mereka, mereka akan lebih termotivasi untuk memperbaikinya. Pengguna biasa pada kernel distribusi seharusnya tidak melihat peringatan atau spam sama sekali, karena biasanya pengguna tidak menggunakan DEBUG_KERNEL.Saya pikir itu adalah ide yang buruk untuk menekan semua pesan dari sudut pandang rekayasa keamanan.
Banyak orang tidak menjalankan kernel debug. Sebagian besar pengguna yang ingin atau perlu mengetahui masalah tidak akan menyadari hal itu terjadi. Pertimbangkan, alasan kami mempelajari masalah systemd adalah karena masalah dmesg.
Menekan semua pesan untuk semua konfigurasi menghasilkan jaringan yang lebih luas dari yang diperlukan. Konfigurasi yang berpotensi terdeteksi dan diperbaiki kemungkinan tidak diperhatikan. Jika masalah tidak terungkap, maka itu tidak akan diperbaiki.
Saya merasa seperti kernel membuat keputusan kebijakan untuk beberapa organisasi. Bagi mereka yang memiliki perangkat keras yang secara efektif tidak dapat diperbaiki, maka organisasi harus memutuskan apa yang harus dilakukan berdasarkan kesulitan risiko mereka. Mereka mungkin memutuskan untuk hidup dengan risiko, atau mereka mungkin memutuskan untuk menyegarkan kembali perangkat keras. Namun, tanpa informasi tentang masalah ini, mereka mungkin tidak menyadari bahwa mereka memiliki item yang dapat ditindaklanjuti.
Kompromi yang akhirnya dicapai di utas adalah setidaknya satu dmesg per modul panggilan.