Mengapa kata sandi acak ini ditandai dengan mengatakan terlalu sederhana / sistematis?

37

Bagaimana string acak M1uG*xgRCthKWwjIjWc*010iSthY9bucyang terdeteksi terlalu sederhana / sistematis untuk kata sandi menurut passwd dan cracklib-check ? Cobalah di mesin Anda dan lihat

echo "M1uG*xgRCthKWwjIjWc*010iSthY9buc" | cracklib-check

Perhatikan bahwa ini bukan kata sandi saya, tetapi string lain yang dihasilkan secara acak dari generator kata sandi acak yang sama yang menghasilkan hasil yang sama.

BeowulfNode42
sumber
3
DikatakanM1uG*xgRCthKWwjIjWc*010iSthY9buc: OK
rici
Ternyata hanya beberapa versi yang mendeteksi ini sesederhana itu. Lihat jawaban slm untuk info lebih lanjut tentang ini.
BeowulfNode42
Mengapa Anda tidak menggunakannya /dev/urandomuntuk menghasilkan kata sandi?
devnull
@devnull - tidak yakin apa yang ada dalam pikiran Anda tetapi menambahkan 2 metode ke A saya tentang cara menghasilkan kata sandi.
slm

Jawaban:

59

Karena cracklib adalah open source, jawabannya dapat ditemukan dalam kode sumber .

"Terlalu sederhana / sistematis" berarti ada terlalu banyak karakter yang didahului oleh salah satu tetangga alfabet mereka. Karenanya "ab" atau "ba" dianggap buruk, tetapi "ac" atau "ca" tidak apa-apa karena b dihilangkan.

Sebelum tambalan ini dari 2010-03-02 , ini memungkinkan paling banyak empat karakter yang menunjukkan sifat ini. Misalnya, "bar12345" akan gagal, karena karakter "a", "2", "3", "4" dan "5" adalah tetangga alfabet dari karakter sebelumnya.

slm menemukan dalam jawabannya M1uG*xgRCthKWwjIjWc*010iSitu OK, sementara M1uG*xgRCthKWwjIjWc*010iSttidak. Mari kita analisa. Berikut adalah karakter yang menurut cracklib-check adalah indikasi kata sandi sistematis:

M1uG*xgRCthKWwjIjWc*010iS
               ^^    ^^

yang di bawah maksimal empat, tetapi menambahkan t:

M1uG*xgRCthKWwjIjWc*010iSt
               ^^    ^^  ^

mendorongnya di atas batas, karena T mengikuti S (tampaknya tes peka huruf besar kecil).

Tambalan mengubah batas maks sehingga tergantung pada panjang kata sandi total, untuk menghindari kesalahan positif seperti ini.

waxwing
sumber
1
Bukankah seharusnya 010 sudah dihitung sebagai 3? Jawaban yang bagus.
John V.
1
Jawaban yang bagus dan terima kasih telah memberikan kode sumber yang berbeda. Omong-omong, apakah ada alasan mengapa file ini disebut fascist.c?
laurent
@ this.lau_ - Saya menduga: en.wikipedia.org/wiki/Fascism
slm
Agak lucu untuk berbicara tentang "lebih kecil" dan "lebih besar" dalam hal karakter, bukan? Yah, meskipun saya tahu ini tentang nilai-nilai ASCII itu mungkin tidak terlalu jelas. - Jadi mengapa tidak menjelaskannya dengan cara yang lebih sederhana? Tidak ada karakter yang harus diikuti oleh tetangga langsung atau pendahulunya. Karenanya, "ab" atau "ba" tidak diizinkan, tetapi "ac" atau "ca" akan karena b dihilangkan.
syntaxerror
Apakah ada alasan mengapa tidak bisa lebih kecil atau lebih tinggi tetapi bisa sama ( Ww)?
Jeroen Vannevel
31

Pada Fedora 19

Ketika saya menjalankannya saya mendapatkan OK. Saya menggunakan Fedora 19.

$ echo 'M1uG*xgRCthKWwjIjWc*010iSthY9buc' | cracklib-check
M1uG*xgRCthKWwjIjWc*010iSthY9buc: OK

Inilah info versi:

$ rpm -qfi /usr/sbin/cracklib-check | grep -E "Version|Release"
Version     : 2.8.22
Release     : 3.fc19

CATATAN: Saya akan mencobanya dengan tanda kutip tunggal alih-alih double qutoes juga karena Anda sedang berhadapan dengan *itu, mereka mungkin akan diperluas dengan cara yang aneh pada Anda.

CentOS 5 & 6

Mencoba contoh Anda di CentOS 6 baik-baik saja, mendapat nilai OK, tetapi gagal seperti yang Anda jelaskan pada CentOS 5.9.

$ echo 'M1uG*xgRCthKWwjIjWc*010iSthY9buc' | cracklib-check
M1uG*xgRCthKWwjIjWc*010iSthY9buc: it is too simplistic/systematic

Informasi versi:

$ rpm -qfi /usr/sbin/cracklib-check | grep -E "Version|Release"
Version     : 2.8.9                  
Release     : 3.3

Bug?

Apa yang Anda temukan sepertinya adalah bug. Jika Anda mengambil string Anda dan menjalankan lebih banyak string cracklib-checkAnda ke dalam Anda akan melihat bahwa ketika Anda sampai ke karakter ke-26 itu mulai gagal:

# 25    
$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iS"
M1uG*xgRCthKWwjIjWc*010iS: OK

# 26
$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iSt"
M1uG*xgRCthKWwjIjWc*010iSt: it is too simplistic/systematic

Menggali lebih dalam tentang ini jika saya mengubah karakter terakhir dari a tuntuk mengatakan vitu terus bekerja.

$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iSvhY9b"
M1uG*xgRCthKWwjIjWc*010iSvhY9b: OK

Jadi akan terlihat bahwa dalam versi cracklib-checksemakin terpaku pada substring Sth.

Pasti ada sesuatu yang aneh tentang potongan string yang Anda berikan. Jika saya mengambil bagian ujung ekor dan menghilangkan bagian depan saya bisa mendapatkan bagian ini gagal juga.

$ cracklib-check <<<"jIjc*010Sth"
jIjc*010Sth: it is too simplistic/systematic

String yang sama menyebabkan masalah pada Fedora 19 & CentOS 6 juga!

PEMBARUAN # 1

Berdasarkan sleuthing @ waxwing yang sangat bagus, kita sekarang tahu bahwa heuristik yang digunakan tersandung jika> 4 karakter terlalu berdekatan satu sama lain. Sebuah tambalan diperkenalkan yang mengubah heuristik ini sehingga panjang keseluruhan kata sandi yang dipertimbangkan dipertimbangkan untuk menghilangkan positif palsu ini.

Kesimpulannya?

Berdasarkan beberapa pengujian terbatas saya, akan muncul bahwa ada beberapa heuristik aneh yang dimainkan di sini. String tertentu yang tampaknya akan baik-baik saja tersandung.

Jika Anda mencoba untuk mengkodifikasikan ini, saya akan menyarankan membungkus generasi & evaluasi kata sandi dan kemudian keluar dari loop setelah kata sandi telah dibuat yang sesuai cracklib-check.

Atau paling tidak saya sarankan memperbarui ke versi yang lebih baru yang mencakup perbaikan yang @maxwing sebutkan dalam jawabannya.

Alternatif Gen Kata Sandi

pwgen

Saya juga akan menambahkan yang biasanya saya gunakan pwgenuntuk menghasilkan kata sandi. Itu mungkin membantu Anda di sini juga.

$ pwgen -1cny 32
iWu0iPh8aena9raSoh{v6me)eh:eu6Ei
urandom

Anda juga dapat menggunakan sihir scripting kecil dengan tr, /dev/urandom, dan folduntuk mendapatkan password acak kualitas yang sangat tinggi.

$ tr -dc '[:graph:]' </dev/urandom | fold -w 32 | head -n 1
;>$7\`Hl$=zn}R.b3h/uf7mY54xp}zSF

The foldperintah dapat mengontrol panjang. Sebagai alternatif, Anda juga dapat melakukan ini:

$ echo $(tr -dc '[:graph:]' </dev/urandom | head -c 32)
/_U>s[#_eLKAl(mrE@oo%X~/pcg$6-kr
slm
sumber
Saya menjalankannya pada CentOS 5.5 dengan cracklib-2.8.9-3.1.src.rpm. Namun dalam kedua kasus bagaimana string acak yang panjang bisa terlalu sederhana?
BeowulfNode42
@ BeowulfNode42 - tidak. Sepertinya Anda telah menemukan bug, atau setidaknya batasan implementasi.
slm
Aneh. Namun string seperti Tm7U:n=@*+4$*gf$6hOngEHJ;mnh$+R6itu baik-baik saja pada mesin yang sama.
BeowulfNode42
1
Kutipan ganda memang mencegah ekspansi glob. Kutipan tunggal masih merupakan ide yang lebih baik, jika string berisi tanda-tanda dolar, backticks, dll.
Dennis
2
"Sebuah tambalan diperkenalkan ..." Perlu juga dicatat bahwa tambalan yang dimaksud bukan yang baru-baru ini (tidak seperti caranya terdengar), tetapi sudah dikirim kembali pada tahun 2010 :)
syntaxerror