/ Dev / random'dan okuma herhangi bir veri üretmez


19

Sık sık komutu kullanıyorum

cat /dev/urandom | strings --bytes 1 | tr -d '\n\t ' | head --bytes 32

sahte rasgele şifreler oluşturmak için. Bu işe yaramıyor /dev/random.

özellikle

  • cat /dev/urandom | strings --bytes 1 | tr -d '\n\t ' çıktı üretir
  • cat /dev/random | strings --bytes 1 çıktı üretir
  • cat /dev/random | strings --bytes 1 | tr -d '\n\t ' gelmez çıktı elde

Dikkat: /dev/randomEntropi oluşturmak için farenizi kıpırdatmanız veya tuşlara (örn. Ctrl, shift, vb.) Basmanız gerekebilir.

Son örnek neden çalışmıyor? Does tro büyük iç tampon çeşit /dev/urandomçabuk doldurur ama /dev/randomdeğil mi?

PS CentOS 6.5 kullanıyorum

cat /proc/version
Linux version 2.6.32-431.3.1.el6.x86_64 (mockbuild@c6b10.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Jan 3 21:39:27 UTC 2014

dağıtımınız, çekirdek sürümünüz nedir? Cygwin'de her iki döndürme değeri.
Kiwy

@Kiwy Bkz. Düzenleme.
Aaron J Lang

1
pwgenÖzellikle biliyor musun pwgen -s?
MvG

2
-sAnahtar daha gerçekten rastgele, onları daha az unutulmaz kılar. @Boyd: makepasswd , Debian tabanlı dağıtımların ötesinde yaygın olarak kullanılabilir mi? Gördüğüm kadarıyla, PWGen CentOS için kullanılabilir iken makepasswd değildir .
MVG

1
@BoydStephenSmithJr. makepasswdPlatformumda bulunmayan @ MvG ile hemfikirim , yine de teşekkürler
Aaron J Lang

Yanıtlar:


27

Sonunda olacak.

İçinde:

cat /dev/random | strings --bytes 1 | tr -d '\n\t '

cat asla arabelleklenmeyecek, ama burada bitiştirilecek hiçbir şey olmadığı için zaten gereksiz.

< /dev/random strings --bytes 1 | tr -d '\n\t '

stringsbununla birlikte, çıkışı artık daha uzun olmadığından, bir terminal , çıkış bir terminale gittiğinde hatların aksine bloklarla (4 veya 8kB gibi bir şey) çıkışını tamponlayacaktır .

Bu yüzden stdout'a yazmaya başlamak için 4kB değerinde karakter biriktirdiği zaman başlayacak, ki bu /dev/randombiraz zaman alacaktır.

trçıkış bir terminale gider (bunu bir terminalde kabuk komut isteminde çalıştırıyorsanız), çıkış satır aralığını arabelleğe alır. Kaldırdığınız için \n, asla yazmak için tam bir satır olmayacaktır, bunun yerine, tam bir blok toplanır toplanmaz (çıkış bir terminale gitmediğinde olduğu gibi) yazacaktır.

Bu nedenle, 8kB (muhtemelen 2 blok daha fazla) veri yazmak için yeterince okunana trkadar hiçbir şey yazmaz (çünkü ilk blok muhtemelen bazı yeni satır veya sekme veya boşluk karakterleri içerecektir).strings/dev/random

Bu sistemde bunu deniyorum, saniyede ortalama 3 bayt alabilirim /dev/random(12MiB'nin aksine /dev/urandom), bu yüzden en iyi senaryoda (ilk 4096 baytın /dev/randomtümü yazdırılabilir olanlardır), 22 dakika önce konuşmak bir trşey çıkarmaya başlar. Ama saatlerce daha hızlı olacak (hızlı bir testte, stringsokuduğunuz her 1 ila 2 blokta bir blok yazdığını görebiliyorum ve çıkış blokları yeni satır karakterlerinin yaklaşık% 30'unu içeriyor, bu yüzden okuması gerekeceğini umuyorum en az 3 blok önce trçıktı almak için 4096 karakter vardır).

Bundan kaçınmak için şunları yapabilirsiniz:

< /dev/random stdbuf -o0 strings --bytes 1 | stdbuf -o0 tr -d '\n\t '

stdbuf bir LD_PRELOAD hilesi aracılığıyla komutların stdio arabelleğe alınmasını değiştiren bir GNU komutudur (bazı BSD'lerde de bulunur).

Yerine geldiğini hatırlatırız stringskullanabileceğiniz tr -cd '[:graph:]'ayrıca sekme, yeni satır ve uzay hariç tutan.

CUTF-8 karakterleri ile gelecekteki olası sürprizlerden kaçınmak için yerel ayarı da düzeltmek isteyebilirsiniz .


vay etkileyici bir açıklama.
Kiwy

2
İnanılmaz! Harika bir açıklama ve çözüm. Her zaman cat'yararsız olarak' kullandım çünkü bir boru hattının sonunda stdin'i yönlendirmeyi hiç sevmedim, şimdi 'bir süreci kaydedebilirim' ve hala okunabilir komutlarım var. Son çözümüm< /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32
Aaron J Lang

@AaronJLang, iyi bir noktaya değindin [:graph:]. Bunu unutmuştum.
Stéphane Chazelas

@AaronJLang, sen gerekmez stdbufiçin head -c32bunu en kısa sürede veri yazmasına izin istemedikçe onu var olarak (yerine yakında ki kadar bir 32byte yığın çeşitli parçalar gibi onları aldım)
Stéphane Chazelas

2
Bence, / dev / urandom yazarın kullanımı için fazlasıyla yeterlidir. Birisi, özellikle, urandom'un rastgele karşılaştırıldığında nasıl çalıştığını merak ediyorsa, çekirdek kaynak ağacının drivers / char / random.c'deki sürücünün üst kısmındaki yorumları okumayı öneririm. Yorumlar, PRNG ve uygulanmasının bir analizinden bahsediyor. Umarım, bu yazı "urandom rastgele ne kadar az ya da çok rastgele?" Burada bulunabilir: eprint.iacr.org/2012/251.pdf
etherfish

5

Birçok güvenlik uygulaması için rasgele sayılar üretmek yeterli entropi gerektirir - entropi, rasgeleliğin ne kadar öngörülemez olduğunu ölçer. Deterministik bir işlemci entropi üretemez, bu nedenle entropi dışarıdan gelmelidir - ya deterministik olmayan davranışa sahip bir donanım bileşeninden ya da kullanıcı eylemlerinin zamanlaması gibi (çoğaltmak için yeterince zor olan diğer faktörlerden) içeri gelir). Yeterli entropi mevcut olduğunda, kriptografi pratik olarak sınırsız rasgele sayılar akışı oluşturmak için kullanılabilir.

Linux bir havuzda entropi biriktirerek ve sonra hem /dev/randomve aracılığıyla kabul edilebilir rasgele sayılar üretmek için kriptografi kullanarak çalışır /dev/urandom. Fark, oluşturduğu /dev/randomher bayt için havuzdaki entropinin tahminini azaltan son derece konservatif bir entropi hesaplaması uygularken, havuzdaki /dev/urandomentropi miktarı ile ilgili değildir.

Havuzdaki entropinin tahmini çok düşükse, /dev/randomdaha fazla entropi birikinceye kadar bloke olur. Bu, /dev/randomçıktı üretme hızını ciddi şekilde sakatlayabilir . Burada gözlemlediğiniz şey bu. Bunun bir ilgisi yok tr; ancak stringsarabelleğe alma ile çıktı okur, bu nedenle /dev/randomen az bir bayt girdi üretmek için tam bir arabelleği (birkaç KB) okumak zorundadır .

/dev/urandomentropi aslında algılanabilir bir şekilde azalmaz, çünkü bir şifreleme anahtarı üretmek için mükemmel kabul edilebilir . (Makinenizi evrenin varolduğundan daha uzun süre çalışır durumda tutarsanız, bu hususları ihmal edemezsiniz, ancak aksi takdirde iyisinizdir.) /dev/urandomİyi olmayan, yeni kurulmuş bir sistemde olan, henüz entropi üretmek için zaman yoktu veya salt okunur medyadan önyükleme yapan yeni açılmış bir sistem.

Ortadan kaldırmak stringsiçin önyükleme zincirinden muhtemelen sürecini hızlandırır. Aşağıda tryazdırma dışı karakterleri filtreleyeceksiniz:

</dev/random LC_ALL=C tr -dc '!-~'

Ancak burada , yeterli entropi biriktirmek için zamanı olmayan bir sistemde şifre oluşturmamaya özen gösterdiğiniz sürece kullanabilirsiniz/dev/urandom . Linux'un entropi havuzunun seviyesini kontrol edebilirsiniz /proc/sys/kernel/random/entropy_avail(kullanırsanız /dev/random, bu dosyadaki şekil muhafazakar olacaktır, muhtemelen çok fazla).


1

Sen kullanmalıdır /dev/urandomyüksek kaliteli (sözde) rasgele sayılar elde etmek ve /dev/randomkesinlikle gerçekten tahmin edilemez rasgele sayılar yalnızca gereksinim duyduğunuzda. NSA'nın kaynaklarının altındaki bir saldırganın çatlamak için çok zor zamanı olacaktır /dev/urandom(ve kauçuk hortum şifrelemesini unutmayın ). Çekirdek bir tamponu "gerçekten rasgele" baytlarla doldurur /dev/random. Ne yazık ki, bunların üretilme oranı düşüktür, bu yüzden çok şey okumak rasgele beklemeyi /dev/random durduracaktır .

Random.org veya şifre üreticisini ya da çok sayıda rastgele şifre oluşturucusundan birini kullanmayı düşünebilirsiniz , birkaç komut satırı ipucu için bu sayfaya bir göz atın (hepsini tavsiye etmiyorum. , ancak size fikir vermelidirler) veya mkpasswd(1)(Fedora 19 bölümünde expect-5.45-8.fc19.x86_64) gibi bir şey kullanabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.