Saya ingin membuat kata sandi acak, dan saya melakukannya seperti ini:
</dev/urandom tr -dc [:print:] | head -c 64
Di laptop saya, yang menjalankan Ubuntu, ini hanya menghasilkan karakter yang dapat dicetak, sebagaimana dimaksud. Tetapi ketika saya ssh ke server sekolah saya, yang menjalankan Red Hat Enterprise Linux, dan menjalankannya di sana, saya mendapatkan output seperti 3!ri�b�GrӴ��1�H�<�oM����&�nMC[�Pb�|L%MP�����9��fL2q���IFmsd|l�K
, yang tidak akan berhasil sama sekali. Apa yang salah di sini?
sumber
:graph:
alih-alih:print:
:</dev/urandom LC_ALL=C tr -dc '[:graph:]' | head -c 64
Pertimbangkan saja
Ini memiliki dua keunggulan:
Anda hanya membaca 48 byte dari perangkat acak, bukan ~ 8KB; jika proses lain pada host yang sama membutuhkan angka acak, 8KB yang dikuras sekaligus bisa menjadi masalah serius. (Ya, bisa dibilang tidak ada yang harus menggunakan perangkat acak pemblokiran , tetapi orang - orang melakukannya .)
Keluaran
base64
hampir tidak mengandung karakter dengan makna khusus. (Untuk tidak sama sekali, taktik| tr +/ -_
pada akhirnya, dan (seperti pada contoh) memastikan jumlah byte masukan untukbase64
merupakan kelipatan dari 3.)Kata sandi yang dihasilkan dengan cara ini memiliki tepat 384 bit entropi, yang agak kurang dari apa yang Anda lakukan (log 2 96 64 ≈ 421,4), tetapi lebih dari cukup untuk sebagian besar tujuan (256 bit entropi aman dalam "masih menebak ketika" Wilayah "Matahari terbakar habis" kecuali untuk kunci RSA, AFAIK).
sumber
Orang lain sudah menunjukkan bahwa lokal menentukan apa
[:print:]
artinya. Namun, tidak semua karakter yang dapat dicetak cocok untuk kata sandi (bahkan dalam ascii). Anda benar-benar tidak ingin spasi, tab, dan # $% ^? di kata sandi Anda - itu tidak hanya sulit untuk diingat, itu juga berpotensi berbahaya bagi sistem otentikasi yang mendasarinya, mungkin tidak mungkin untuk masuk dalam bidang input, dan sebagainya. Dalam hal ini, Anda harus memilih karakter "waras" secara manual:atau sederhana
Atau bahkan lebih baik, gunakan
base64
seperti yang disarankan dalam jawaban lain.sumber
?
atau^
terlalu buruk untuk dianggap serius.[:print:]
class tidak termasuk tab. Ini hanya[:alnum:]
+[:punct:]
+ ruang (ruang tunggal, bukan[:space:]
).Bagaimana dengan
string harus mencetak output urandom dalam format yang dapat dicetak
sumber
-bash: /dev/urandom: Permission denied
Saya tidak tahu apakah ada alasan mengapa Anda menggunakan
/dev/random
untuk menghasilkan kata sandi, tapi saya akan merekomendasikan Anda menggunakan pwgen untuk mengurangi rasa sakit Anda.Di mana 10 adalah panjang kata sandi.
http://man.cx/pwgen
sumber
Metode ini IMHO lebih pintar ketika mengkonsumsi data dari / dev / urandom String yang disisipkan sebagai $ P $ P $ P ... harus memiliki setidaknya 256 karakter.
sumber