Membaca dari dev / urandom - perilaku sistem
Saat membaca from dev/urandom, dengan say heador dd, tentunya diharapkan keluarannya selalu acak dan berbeda.
Bagaimana ini ditangani oleh UNIX pada level rendah? Apakah file secara alami terpotong saat membaca atau sebaliknya adalah file sebenarnya merupakan antarmuka untuk sandi simetris atau yang setara dan dengan demikian "membaca" sebenarnya adalah tindakan mengeksekusi sandi.
Jawaban
/dev/urandomadalah perangkat karakter, bukan file biasa. Membukanya menyediakan antarmuka ke driver, biasanya di kernel, yang menangani pembacaan; setiap kali program membaca dari /dev/urandom, panggilan dilakukan ke driver, dan driver menentukan cara menyediakan konten yang sesuai (sama seperti perangkat karakter lainnya - /dev/null, /dev/zero...).
Di Linux, ini diterapkan di drivers/char/random.c. Ini memelihara "kumpulan entropi", yang diunggulkan dari berbagai sumber data acak, dan ketika dibaca, memproses data kumpulan menggunakan cipher aliran ChaCha untuk membuat data yang akan dikembalikan.
/dev/urandombukan 'file biasa' (ya, ini penamaan POSIX), ini adalah perangkat. Sama seperti kebanyakan 'file' di / dev / Jadi, Anda memiliki banyak perilaku ajaib di sana.
- Anda memiliki
/dev/null, di mana tidak peduli seberapa banyak Anda menulis, itu tidak pernah mengisi - Anda memiliki / urandom / srandom acak, memberikan data yang berbeda secara acak setiap kali
- Anda memiliki
/dev/tty(dan kolega) di mana Anda berinteraksi dengan terminal - Anda memiliki
/dev/fullyang selalu mengembalikan "Tidak ada ruang tersisa di perangkat" untuk setiap percobaan menulis - Anda memiliki
/dev/zeroyang mengembalikan kumpulan nul byte yang tak terbatas
dan masih banyak lagi.
File-file ini sebenarnya adalah antarmuka untuk berinteraksi dengan modul kernel. Jadi, ketika Anda 'membacanya', itu sebenarnya menjalankan fungsi yang diminta untuk membaca sebanyak byte yang diminta oleh program Anda (head, dd, dll.) ( /dev/urandomAdalah perangkat karakter ). Fungsi ini kemudian menanganinya secara internal (berdasarkan beberapa kumpulan entropi) untuk mengisi buffer tersebut (dalam hal ini, sehingga Anda mendapatkan konten pseudorandom).