481 / 736RNG

Random Number Generator

Pembangkit bilangan acak

Saat dompet membuat rahasia baru, ia membutuhkan angka yang tidak bisa ditebak orang lain. Generator bilangan acak membantu menyediakan angka itu, tetapi tidak semua generator cocok untuk melindungi uang.

Random Number Generator, atau RNG, adalah perangkat atau program yang menghasilkan nilai angka. Dompet membutuhkan generator yang aman secara kriptografis: mengetahui hasil sebelumnya atau waktu pembuatannya tidak boleh membuat penyerang mampu memprediksi rahasia baru secara praktis. Hal ini bergantung pada sumber entropi, algoritme, dan cara aplikasi menggunakannya. Di sini, entropi menggambarkan ketidakpastian penyerang tentang hasilnya.

Bayangkan dompet yang menurunkan rahasianya hanya dari waktu saat ini. Hasilnya mungkin terlihat rumit, tetapi orang yang tahu waktu pembuatannya akan memiliki jauh lebih sedikit kemungkinan untuk dicoba. RFC 4086 memperingatkan tentang masukan yang dapat diprediksi seperti ini. Generator yang cocok untuk permainan atau simulasi belum tentu cocok untuk kunci. Distribusi statistik yang baik pun tidak dengan sendirinya membuktikan keamanan. [2]

Biasanya beberapa bagian bekerja sama. Sumber menyediakan ketidakpastian, keluarannya diolah sesuai kebutuhan, lalu generator deterministik kriptografis membuat nilai berikutnya dari keadaan internal yang rahasia. Deterministik berarti keadaan internal dan masukan yang sama menghasilkan keluaran yang sama. Karena itu, keadaan internal tersebut harus dirahasiakan. Aplikasi meminta nilai melalui antarmuka sistem. Jadi, tidak setiap bit yang dikembalikan memerlukan pengukuran fisik baru. NIST SP 800-90C menjelaskan penggabungan generator menurut 90A dengan sumber menurut 90B. [1]

Dalam BIP39, dasar pemulihan dompet dibuat sebelum kata pertama muncul: generator menghasilkan 128 hingga 256 bit entropi awal. Bit adalah satuan dasar informasi, berupa nol atau satu; yang penting, penyerang tidak dapat memprediksi urutan hasilnya. Checksum, nilai singkat yang membantu mendeteksi sebagian kesalahan penyalinan, ditambahkan sebelum semuanya diubah menjadi kata pemulihan. Anda dapat melengkapinya dengan passphrase, teks rahasia tambahan. Fungsi PBKDF2 menurunkan seed 512 bit dari masukan tersebut: nilai awal rahasia untuk menurunkan kunci dompet. Keluaran yang lebih panjang maupun checksum tidak menambah keacakan yang kurang. Karena itu, jangan memilih sendiri kata pemulihan. [6]

Perangkat harus mendeteksi kegagalan seperti sumber derau yang mulai mengulang nilai yang sama. Karena itu, NIST SP 800-90B mewajibkan pemeriksaan saat mulai dan selama beroperasi, serta penanganan kegagalan yang ditemukan. Kesalahan tidak boleh diabaikan sambil terus menyebut keluarannya sebagai keacakan yang terverifikasi. Pemeriksaan ini memantau sumber; bukan menjamin keamanan seluruh dompet. [3]

Generator deterministik menyimpan keadaan internal untuk menghitung hasil berikutnya. NIST SP 800-90A menjelaskan pembentukan, pembangkitan, penambahan entropi baru (reseed), dan penghentian. Jika keadaan itu bocor, sekadar memanggil generator lagi belum tentu memulihkan keamanan. Diperlukan prosedur yang tepat dan entropi baru yang tidak diketahui penyerang. Hal itu tidak menghapus kunci yang sudah terungkap dari tangan penyerang. [7]

Anda tidak perlu memprogram RNG sendiri. Perhatikan apakah cara pembangkitan dan penanganan kesalahan didokumentasikan untuk versi dompet yang digunakan. Label “hardware” atau “offline” saja tidak membuktikannya. Peninjauan harus mencakup sumber, algoritme, inisialisasi, dan antarmuka aplikasi. Bahkan rahasia yang dibuat dengan benar kehilangan perlindungan jika cadangannya kemudian Anda ungkapkan. [1] [2]

Secara default, getrandom() di Linux menunggu inisialisasi urandom; dengan GRND_NONBLOCK, ia dapat mengembalikan EAGAIN alih-alih menunggu. Setelah inisialisasi, permintaan urandom paling banyak 256 byte dijamin terbaca penuh tanpa terputus oleh sinyal. Permintaan yang lebih besar tidak memiliki jaminan ini. Program harus memeriksa status kembalian dan jumlah byte yang benar-benar diterima. [4]

Web Crypto menyediakan getRandomValues() untuk mengisi larik bilangan bulat yang didukung dengan nilai kuat secara kriptografis. Di atas 65536 byte, ia melempar QuotaExceededError. Untuk kunci algoritme yang didukung, spesifikasi menyarankan generateKey(); ini bukan generator universal dompet Bitcoin. Pemakaian API yang benar juga tidak membuktikan bahwa halaman tepercaya: kodenya dapat memiliki akses ke rahasia yang dibuat. [5]

Untuk gambaran yang lebih utuh, baca entri ini bersama Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. Entri ini juga dirujuk dari CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.

DOC · 001NIST SP 800-90C — RBG constructionsSpesifikasi DOC · 002RFC 4086 — Unpredictability and weak inputsSpesifikasi DOC · 003NIST SP 800-90B — Source health and failure handlingSpesifikasi DOC · 004Linux getrandom(2) — Initialization and return behaviorDokumentasi DOC · 005W3C Web Crypto — getRandomValues and key generationSpesifikasi DOC · 006BIP39 — Initial entropy and mnemonic-to-seed derivationSpesifikasi DOC · 007NIST SP 800-90A Rev. 1 — DRBG lifecycle and reseedingSpesifikasi
Direvisi: Utamakan sumber · Bukan nasihat investasi