Seperti @DavidSchwartz tunjukkan dalam komentar , penggunaan /dev/urandomlebih 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.
Jumlah entropi diperkirakan secara konservatif, tetapi tidak dihitung
/dev/urandomtidak akan pernah memblokir, membaca dari /dev/randomdapat menghentikan proses eksekusi.
Dalam kasus yang jarang terjadi, tidak lama setelah boot, CSPRNG mungkin tidak memiliki cukup entropi untuk diunggulkan dengan benar dan /dev/urandommungkin tidak menghasilkan keacakan berkualitas tinggi.
Entropi hampir tidak masalah jika CSPRNG awalnya diunggulkan dengan benar
CSPRNG terus-menerus diunggulkan
Di Linux 4.8 dan selanjutnya, /dev/urandomtidak menguras kumpulan entropi (digunakan oleh /dev/random) tetapi menggunakan output CSPRNG dari hulu.
macOS menggunakan 160-bit Yarrow berdasarkan SHA1. Tidak ada perbedaan antara / dev / random dan / dev / urandom; keduanya berperilaku identik. IOS Apple juga menggunakan Yarrow.
/dev/urandomhanyalah tautan ke /dev/randomdan 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.
NetBSD
Gunakan /dev/urandom, dengan asumsi sistem Anda telah membaca setidaknya sekali /dev/randomuntuk memastikan penyemaian awal yang tepat.
/dev/randomTerkadang 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.
BSD: Penggunaan/dev/urandom - Kecuali tidak ada yang namanya /dev/urandompada 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?
Satō Katsura
1
@SatoKatsura Tangkapan yang bagus. Diperbarui ke FreeBSD untuk mencerminkan kutipan. Bagaimana Anda akan mengusulkan untuk menentukan siapa orang-orang itu?
Tom Hale
3
Kualifikasi akademik? Pekerjaan peer-review?
Satō Katsura
1
" /dev/randomblok ketika kehabisan entropi" - Di Linux, itu tergantung bagaimana Anda membuka perangkat. Jika openbendera termasuk O_NONBLOCKmaka itu tidak akan diblokir. Jika tidak ada entropi maka panggilan akan segera kembali dan menunjukkan 0 byte dibaca.
1
@ TomHale Perilaku ini kurang mengejutkan dari IMO. Jika /dev/randomhanya (ex :) 60 byte, ddakan memberi Anda file 60 byte. Menggunakan headdalam skenario yang sama mungkin akan terlihat seperti menggantung selamanya. Baik melakukan apa yang Anda inginkan, tetapi, setidaknya bagi saya, lebih jelas bahwa headtidak melakukan apa yang diharapkan.
Ryan J
5
Secara tradisional, satu-satunya perbedaan antara /dev/urandomdan /dev/randomapa yang terjadi ketika kernel berpikir tidak ada entropi dalam sistem - /dev/randomgagal ditutup, /dev/urandomgagal terbuka. Kedua pembalap itu sumber entropi dari add_disk_randomness(), add_interrupt_randomness(), dan add_input_randomness(). Lihat /drivers/char/random.csecara spesifik.
Diedit untuk menambahkan: Pada Linux 4.8 /dev/urandomsedang 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/urandomsaat membuat kunci RSA dan tidak memiliki cukup entropi. Baca Menambang Ps dan Qs Anda .
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/randomdan sering mengalami kegagalan. Tes melakukan tiga langkah: (1) tiriskan /dev/randomdengan 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-toolspaket 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.
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.
Jawaban:
TL; DR
Gunakan
/dev/urandom
untuk tujuan paling praktis.Jawaban yang lebih lama tergantung pada rasa Unix yang Anda jalankan.
Linux
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
.Menghasilkan pad satu kali dengan keamanan teori informasi
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 berdasarkangetrandom()
.macOS
Tidak masalah, seperti yang dikatakan Wikipedia :
FreeBSD
Tidak masalah, seperti yang dikatakan Wikipedia :
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.
NetBSD
Gunakan
/dev/urandom
, dengan asumsi sistem Anda telah membaca setidaknya sekali/dev/random
untuk memastikan penyemaian awal yang tepat.The rnd (4) manualnya mengatakan :
sumber
/dev/urandom
- Kecuali tidak ada yang namanya/dev/urandom
pada OpenBSD. OpenBSD memiliki/dev/arandom
, tetapi Anda tidak seharusnya menggunakannya, Anda harus menggunakanarc4random(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. Jikaopen
bendera termasukO_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. Menggunakanhead
dalam skenario yang sama mungkin akan terlihat seperti menggantung selamanya. Baik melakukan apa yang Anda inginkan, tetapi, setidaknya bagi saya, lebih jelas bahwahead
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 dariadd_disk_randomness()
,add_interrupt_randomness()
, danadd_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 .sumber
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 :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 :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:
Kompromi yang akhirnya dicapai di utas adalah setidaknya satu dmesg per modul panggilan.
sumber