Kapan harus menggunakan / dev / random vs / dev / urandom

Jawaban:

79

TL; DR

Gunakan /dev/urandomuntuk tujuan paling praktis.

Jawaban yang lebih lama tergantung pada rasa Unix yang Anda jalankan.

Linux

Secara historis, /dev/randomdan /dev/urandomkeduanya diperkenalkan pada saat yang sama.

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.

Singkatnya:

  • The manualnya menyesatkan
  • Keduanya diberi makan oleh CSPRNG yang sama untuk menghasilkan keacakan ( diagram 2 dan 3 )
  • /dev/random blok ketika kehabisan entropi
  • 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.
  • Gunakan /dev/urandom.

Pengecualian terhadap aturan

Dalam Kriptografi Stack Exchange Kapan menggunakan /dev/randomlebih /dev/urandomdi Linux @otus memberikan dua kasus penggunaan :

  1. Segera setelah boot pada perangkat entropi rendah, jika cukup entropi belum dihasilkan untuk diunggulkan dengan benar /dev/urandom.

  2. 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/urandomdan hanya memblokir jika entropi benih awal tidak tersedia.

Ada masalah dengan perubahan /dev/urandomuntuk digunakangetrandom() , tetapi dapat dibayangkan bahwa /dev/xrandomperangkat baru dibuat berdasarkan getrandom().

macOS

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.

FreeBSD

Tidak masalah, seperti yang dikatakan Wikipedia :

/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.

The rnd (4) manualnya mengatakan :

/dev/urandom Jangan pernah menghalangi.

/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.

Tom Hale
sumber
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 .

Kirill Sinitski
sumber
5

Ini semacam jawaban "saya juga", tetapi itu memperkuat rekomendasi Tom Hale. Ini berlaku untuk Linux.

  • Menggunakan /dev/urandom
  • Jangan gunakan /dev/random

Menurut Theodore Ts'o di milis Linux Kernel Crypto, /dev/randomtelah 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/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.

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.


sumber