it-swarm-id.com

Apakah Rand dari / dev / urandom aman untuk kunci masuk?

Katakanlah saya ingin membuat cookie untuk pengguna. Apakah hanya menghasilkan 1024 bit string dengan menggunakan / dev/urandom , dan memeriksa apakah sudah ada (perulangan sampai saya mendapatkan yang unik) sudah cukup?

Haruskah saya membuat kunci berdasarkan sesuatu yang lain? Apakah ini rawan eksploitasi?

187
Incognito

Jawaban singkatnya adalah ya. Jawaban panjangnya juga ya. /dev/urandom Menghasilkan data yang tidak dapat dibedakan dari keacakan yang sebenarnya, mengingat teknologi yang ada. Mendapatkan keacakan "lebih baik" dari pada apa /dev/urandom memberikan tidak ada artinya, kecuali Anda menggunakan salah satu dari beberapa algoritma kriptografi "teori informasi", yang bukan kasus Anda (Anda akan mengetahuinya).

Halaman manual untuk urandom agak menyesatkan, bisa dibilang salah, ketika itu menunjukkan bahwa /dev/urandom dapat "kehabisan entropi" dan /dev/random harus lebih disukai; satu-satunya instan dimana /dev/urandom mungkin menyiratkan masalah keamanan karena entropi rendah adalah pada saat-saat pertama instalasi OS baru yang otomatis; jika mesin boot ke titik di mana ia mulai memiliki beberapa aktivitas jaringan maka ia telah mengumpulkan cukup keacakan fisik untuk memberikan keacakan kualitas yang cukup tinggi untuk semua penggunaan praktis (saya berbicara tentang Linux di sini; pada FreeBSD, sesaat sesaat dari sedikit kelemahan tidak terjadi sama sekali). Di samping itu, /dev/random memiliki kecenderungan memblokir pada waktu yang tidak tepat, yang mengarah ke masalah kegunaan yang sangat nyata dan menjengkelkan. Atau, untuk mengatakannya dengan lebih sedikit kata: gunakan /dev/urandom dan berbahagialah; gunakan /dev/random dan mohon maaf.

( Edit: halaman Web ini menjelaskan perbedaan antara /dev/random dan /dev/urandom cukup jelas.)

Untuk tujuan menghasilkan "cookie": cookie tersebut harus sedemikian rupa sehingga tidak ada dua pengguna yang berbagi cookie yang sama, dan bahwa secara komputasi tidak layak bagi siapa pun untuk "menebak" nilai cookie yang ada. Urutan byte acak melakukannya dengan baik, asalkan menggunakan acak kualitas yang memadai (/dev/urandom baik-baik saja) dan itu cukup lama. Sebagai aturan praktis, jika Anda memiliki kurang dari 2n pengguna ( n = 33 jika seluruh populasi Bumi dapat menggunakan sistem Anda), maka urutan n + 128 bit cukup lebar ; Anda bahkan tidak perlu memeriksa tabrakan dengan nilai yang ada: Anda tidak akan melihatnya seumur hidup. 161 bit cocok dalam 21 byte.

There are beberapa trik yang dapat dilakukan jika Anda ingin cookie yang lebih pendek dan masih ingin menghindari mencari tabrakan di database Anda. Tapi ini seharusnya tidak perlu untuk cookie (saya berasumsi konteks berbasis Web). Juga, ingatlah untuk menjaga kerahasiaan cookie Anda (mis. Gunakan HTTPS, dan tetapkan bendera "aman" dan "HttpOnly").

222
Thomas Pornin

Ya, ini cara yang bagus.

@ Penjelasan Thomas paku itu. Dan dia sepenuhnya benar untuk mengkritik /dev/urandom halaman manual. Spot on.

Tetapi lewati "memeriksa apakah sudah ada". Pemeriksaan itu tidak ada gunanya. Itu tidak akan terjadi. (Peluang terjadinya itu lebih rendah daripada kemungkinan tersambar petir - beberapa kali - di hari yang sama.)

25
D.W.

Waspadai Edge-case jika Anda menggunakan Linux atau NetBSD.

Di Linux, Anda ingin memastikan bahwa cukup entropi telah diperoleh setelah boot untuk seed CSPRNG, atau menggunakan getrandom() system call untuk membaca dari /dev/urandom dan hanya memblokir jika jarang terjadi entropi seed pascabooting yang memadai tidak tersedia.

Di NetBSD, Anda ingin membaca dari /dev/random setidaknya satu kali sebelum membaca dari /dev/urandom untuk memastikan telah diunggah dengan benar.

Pada FreeBSD dan MacOS tidak ada perbedaan antara /dev/random dan /dev/urandom.

Jawaban singkatnya masih menggunakan /dev/urandom.

Lihat Kapan menggunakan/dev/acak vs/dev/urandom untuk detail lebih lanjut.

1
Tom Hale