Saya ingin membuat string acak (misalnya kata sandi, nama pengguna, dll.). Seharusnya dimungkinkan untuk menentukan panjang yang dibutuhkan (mis. 13 karakter).
Alat apa yang bisa saya gunakan?
(Untuk alasan keamanan dan privasi, sebaiknya string dihasilkan secara off-line, sebagai lawan online di situs web.)
apg
secara pribadi.)apg
untuk menghasilkan string acak./dev/urandom
). Akan menyenangkan untuk memiliki beberapa jawaban menggunakan generator nomor acak yang benar , berdasarkan misalnya random.org .Jawaban:
Cara favorit saya untuk melakukannya adalah dengan menggunakan
/dev/urandom
bersamatr
untuk menghapus karakter yang tidak diinginkan. Misalnya, untuk mendapatkan hanya angka dan huruf:Atau, untuk memasukkan lebih banyak karakter dari daftar karakter khusus kata sandi OWASP :
Jika Anda memiliki beberapa masalah dengan
tr
mengeluh tentang input, coba tambahkanLC_ALL=C
seperti ini:sumber
head /dev/urandom | tr -dc A-Za-z0-9 | head -c10
- Cara ini lebih akurat. Anda mendapatkan 10 karakter yang merupakan huruf besar, kecil, atau digithead
Perintah pertama mungkin bermasalah. Ini akan menampilkan 10 baris pertama dari/dev/urandom
, yang berarti akan berhenti setelah melihat baris ke-10. Jadi panjang output yang dikirim ketr
perintah adalah acak. Ada kemungkinan bahwa akan ada kurang dari 13 karakter dalam output daritr
. Saya belum menghitung kemungkinan ini terjadi, perhitungannya sedikit rumit.<dev/urandom tr -dc "$charset" | head -c "$length"
tr -dc A-Za-z0-9\!\"#$\&\'\(\)\*+,-./\:\\\\\;\<=\>\?@[]^_`{\|}~
tr ..
perintah Anda tetapi hanya mengutip semuanya (kecuali untuk kutipan tunggal) bekerja -tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'
.Untuk menghasilkan kata sandi acak, Anda dapat menggunakan
pwgen
:Hasilkan 7 kata sandi dengan panjang 13:
Seperti yang disebutkan dalam komentar, Anda dapat menghindari pengurangan entropi dengan menggunakan
-s
argumen (yaitu menghasilkan kata sandi yang lebih aman, benar-benar acak tetapi sulit diingat):Untuk menghasilkan nama pengguna acak, Anda dapat menggunakan
gpw
:Hasilkan 7 kata sandi (nama pengguna) dengan panjang 13:
sumber
pwgen -s
.Saya menggunakan
openssl
perintah, pisau kriptografi tentara swiss.atau
sumber
rand -hex
akan membatasi output hanya 16 karakter, daripada 90+ di keyboard saya. base64 lebih baik karena 64 karakter, tetapi tidak acak (misalnya ada pola padding yang dapat diprediksi, dan mungkin beberapa karakter muncul lebih sering daripada yang lain).openssl rand -base64 12
menghasilkan 16 karakter output (karena 256 nilai dipetakan ke 64). Dan contoh hex menghasilkan 24 karakter. Tidak ada kerugian dalam kasus hex karena ini adalah pemetaan 1: 2 yang sederhana, tetapi mungkin ada sedikit dalam kasus base64 sejak padding digunakan. Radix tidak memengaruhi keacakan, melainkan cara seseorang memetakan yang lain. (dan jumlah bit total jauh lebih penting).Begini caranya, saya melakukannya. Ini menghasilkan 10 karakter string acak. Anda dapat mengoptimalkannya dengan mengganti "lipatan", dengan alat pengolah string lainnya.
sumber
/dev/urandom
tentu sajaUntuk menghasilkan kata sandi dengan entropi setinggi mungkin dengan alat Linux standar yang dibangun ke dalam setiap distribusi yang saya gunakan:
Ini menghasilkan semua karakter ASCII yang dapat dicetak - dari 32 (spasi) hingga 126 (tilde,
~
). Panjang kata sandi dapat dikontrol dengan benderahead
's-c
. Ada juga set karakter lain yang mungkin adatr
(tidak termasuk spasi, hanya karakter 33-126, gunakan[:graph:]
).sumber
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32; echo
jika Anda tidak mau` characters in generated string.
`karena karakter pelarian dalam banyak bahasa menyebabkan masalah< /dev/urandom tr -cd "[:print:]" | tr -d ' \\/\`\|' | head -c 32; echo
untuk mengecualikan | \ / `dan spasiBergantung pada tingkat keacakan yang Anda inginkan, Anda bisa dengan variabel bawaan bash's (juga
zsh
danksh
, mungkin orang lain)$RANDOM
:Metode membaca langsung dari
/dev/urandom
jauh lebih sederhana, tetapi demi penyelesaian, Anda juga dapat menggunakan$RANDOM
:Penting : solusi ini hanya akan menghasilkan string acak menggunakan 10 huruf pertama dari alfabet. Apakah itu cukup atau tidak untuk Anda tergantung pada untuk apa Anda membutuhkannya.
sumber
$RANDOM
akan mencetak angka antara 0 dan 32767.rand=$(head -c 100 /dev/urandom | tr -dc A-Za-z0-9 | head -c13)
sebagai gantinya.Terinspirasi oleh Pablo Repetto Saya akhirnya dengan solusi yang mudah diingat ini :
-z menghindari multi-line output
-e gema hasilnya
-r izinkan karakter apa saja muncul beberapa kali
-n20 String acak dengan panjang 20 karakter
{A..Z} {a..z} {0..9} kelas char diizinkan
shuf
adalah bagian dari coreutils linux dan banyak tersedia atau paling tidak porting.sumber
@Brandin menjelaskan dalam komentar ke jawaban lain bagaimana cara mendapatkan paling banyak 100 byte dari
/dev/urandom
penggunaanhead -c 100
. Cara lain untuk melakukan ini adalah dengandd
:Di
2>/dev/null
akhirdd
perintah adalah untuk menekan output "... records in / ... records out".Saya tidak mengetahui adanya keuntungan / kerugian substansial antara kedua metode ini.
Saya punya masalah dengan kedua metode
tr
mengeluh tentang input. Saya pikir ini adalah karena tidak suka menerima masukan biner, dan karenanya disarankan penyaringan pertama/dev/random
denganiconv -c -t US
. Namun, Gilles menyarankan diagnosis dan solusi yang berbeda, yang bekerja untuk saya:sumber
iconv
solusinya memaksimalkan satu inti CPU dan tidak menghasilkan output (saya menunggu 10-an sebelum membunuhnya) ...libc-bin
2.19. Saya tidak yakin apakah itu ikon yang sama ...tr
mendukung input biner. Namun rentang sepertiA-Z
mungkin dipengaruhi oleh pengaturan lokal. CobaLC_ALL=C tr …
tr
melakukannya karena tidak mendukung multibyte sama sekali (mis. Terakhir kali saya memeriksanya, mengubah case diterapkan dengan hanya mengatur bit keenam dari setiap byte). Sistem lain (misalnya BSD) mendukung multibyte dan ini akan gagal di sana karena kemungkinan aliran input acak juga merupakan aliran multibyte yang valid sangat kecil di sebagian besar pengkodean. GNU dapat menambahkan dukungan multibyte pada saat tertentu, pada titik mana ini akan gagal. Tentu saja, pengaturanLC_ALL=C
akan memperbaikinya.tr
memproses input biner (di lokal C). (Ya, ok, ini hanya mengatakan secara eksplisit bahwa byte nol harus didukung, tidak dikatakan bahwa file tidak kosong yang tidak diakhiri dengan karakter baris baru harus didukung, tetapi dalam praktiknya selalu demikian halnya.)APG
disertakan secara default pada beberapa distribusi Linux.Untuk menghasilkan kata sandi dari ukuran 5 hingga 10 di himpunan bagian Khusus, Numerik, Modal dan Bawah, perintahnya adalah:
Dan kembali
Seperti yang dikatakan oleh @landroni dalam komentar.
sumber
apg -a1 -m14
Anda dapat menggunakan salah satu
md5
alat yang memiliki tujuan ini. Dalam hal membuat kata sandi yang sepenuhnya acak, Anda dapat menggunakanmd5pass
. Ini adalah alat yang sangat sederhana untuk digunakan dan sangat membantu, karena Anda dapat menggunakan "teks normal" bersama dengan "garam" untuk melompati konstruksi kata sandi yang sama yang dapat Anda pulihkan setelahnya, atau Anda mungkin ingin mendapatkan yang sepenuhnya kata sandi acak sepanjang waktu. Penggunaan umum adalah:di mana
password
adalah kata yang dipilih yang akan digunakan untuk pembangunan string acak dansalt
merupakan lompatan byte yang akan digunakan. Seperti ini:Ini akan membuat kata sandi "urutan acak" untuk Anda gunakan. Jika Anda tidak menggunakan
salt
, maka Anda mungkin tidak dapat membuat ulang string yang sama ini setelahnya.Namun jika Anda menggunakan
salt
seperti ini:maka Anda dapat membuat urutan yang dapat Anda pulihkan jika Anda menggunakan kata tersebut dalam hubungannya dengan garam yang sama (atau lompatan) jika kata aslinya didefinisikan.
sumber
salt
sedang digunakan, ini terdengar mirip dengan pendekatan PasswordMaker ...Gunakan
xxd
perintah untuk menentukan panjang (via -l) yang berfungsi di Linux dan OS. https://www.howtoforge.com/linux-xxd-command/sumber
Kedua perintah ini masing-masing menghasilkan kata sandi dan kata sandi acak.
Pembuat kata sandi memerlukan file_with_characters yang berisi semua karakter yang Anda inginkan untuk menggunakan kata sandi, satu karakter per baris, dan masing-masing tepat satu kali. File tidak boleh mengandung baris kosong, dan baris harus diakhiri dengan baris baru.
Generator frasa sandi memerlukan file_with_words yang berisi semua kata yang Anda inginkan frasa sandi, satu kata per baris, dan masing-masing tepat satu kali. File tidak boleh mengandung baris kosong, dan baris harus diakhiri dengan baris baru.
Opsi --head-count menentukan panjang kata sandi - dalam karakter - atau frasa sandi - dalam kata-kata.
sumber
Saya telah menemukan bahwa pemipaan / dev / urandom ke tr di macOS tidak berfungsi. Inilah cara lain:
sumber
Saya menggunakan:
base64 < /dev/urandom | tr -d 'O0Il1+\' | head -c 44
Ini memberi saya 57 kemungkinan karakter. String dapat disalin-tempel (dihapus
+
dan\
) atau dicetak dan diketik ulang karena karakter yang sulit dibedakan (I1lO0
) telah dihapus.Saya suka ini karena:
Penghargaan untuk https://unix.stackexchange.com/a/230676/9583 dan terutama komentar untuk inspirasi awal saya.
sumber
1
tanpa mengurangi entropi (sambil menghasilkan yang baru untuk mendapatkan satu w / nomor tidak mengurangi entropi). Anda juga dapat menambahkan a dengan aman!
tanpa mengurangi entropi. Tidak ada skema yang meningkatkan entropi layak apa pun, tetapi dapat membuat string yang dihasilkan sesuai dengan persyaratan kata sandi yang lebih lama.Filosofi Unix tentang "banyak alat kecil yang melakukan satu hal dengan baik" sangat membantu Anda dalam hal ini.
/dev/urandom
adalah aliran acak "byte" (yang termasuk karakter yang tidak dapat dicetak)base64
mengkodekan data byte ke[A-Za-z0-9/+]
(yang sepenuhnya dapat dicetak)dd
menyalin input ke output yang menerapkan pengubah yang diberikan sebagai argumen (yang dapat mencakup ukuran blok dan jumlah blok)OSX
Linux
Catatan:
tr -d '[A-Z/+]'
untuk menghilangkan huruf kapital dan+
dan/
bs
(ukuran blok) dengan panjang berapa pun yang Anda butuhkan.base64
bungkus menjadi 76 kolom secara default dan harus diatur ulang-w0
kecuali Anda menginginkannya.sumber
Saya ingin berkontribusi perintah biasa saya untuk menghasilkan kata sandi
Untuk mengkonfigurasi panjang kata sandi, ubah angka dalam perintah potong dengan panjang yang Anda perlukan, misalnya, 24 karakter
Tidak ingin membingungkan 0 atau O, 1 atau l? Saring dengan yang lain
tr
Saya pribadi tidak pernah memilih karakter khusus dalam kata sandi, itu sebabnya saya hanya memilih
[:alnum:]
untuk pembuat kata sandi sayasumber
Saya memelihara
secpwgen
di Alpine Linux & menyimpan sumber di Github saya .Ini dapat menghasilkan string acak atau frasa diceware:
Untuk menghasilkan string acak 13 karakter, Anda akan menggunakan:
Bagi pengguna untuk mengingat kata sandi, gunakan frasa diceware:
Saya pribadi suka:
sumber
Cara saya untuk kata sandi yang sangat aman (di mana 16 adalah panjang pw):
Contoh hasil:
Atau sebagai alternatif, untuk menghasilkan banyak kata sandi:
cat / dev / urandom | tr -cd [: grafik:] | fold -w 16 | head -6
Contoh hasil:
Sedikit kurang aman (rangkaian karakter yang lebih kecil):
Contoh hasil:
sumber
Cara super mudah dan sederhana (mungkin lebih sederhana daripada yang Anda cari) untuk mencapai ini adalah dengan menghasilkan angka acak dalam rentang yang diberikan, mengonversi angka itu ke karakter ASCII yang setara, dan menambahkannya ke akhir string .
Berikut ini contoh dasar dalam Python:
EDIT: menambahkan komentar, dan menambahkan kode untuk menghasilkan banyak kata sandi dan menulisnya ke file
sumber
Saya ingin perintah ini:
sumber
date +%N
Karena jika Anda menghasilkan banyak pengguna dan kata sandi dalam sebuah skrip, detik mungkin menjadi sama untuk banyak atau bahkan untuk semua perintah tanggal, sehingga menghasilkan kata sandi yang identik.dd if=/dev/random bs=512 count=1
?Aku pergi, ke http://passwordsgenerator.net/ ia memungkinkan menghasilkan string karakter acak hingga 2048 karakter, memilih huruf besar, huruf kecil, angka 0 hingga 9, tanda baca, atau kombinasi apa pun.
sumber