Ketika seorang pengguna di situs kami kehilangan kata sandinya dan menuju ke halaman Kata Sandi Hilang kami perlu memberinya kata sandi sementara yang baru. Saya tidak terlalu peduli seberapa acak ini, atau jika cocok dengan semua aturan kata sandi yang kuat "yang dibutuhkan", yang ingin saya lakukan adalah memberi mereka kata sandi yang dapat mereka ubah nanti.
Aplikasi ini adalah aplikasi Web yang ditulis dalam bahasa C #. jadi saya berpikir untuk menjadi jahat dan pergi untuk rute yang mudah menggunakan bagian dari Guid. yaitu
Guid.NewGuid().ToString("d").Substring(1,8)
Saran? pikiran?
Jawaban:
Selalu ada
System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters
) .sumber
ASP.NET Core
?Ini memiliki manfaat yang baik karena dapat memilih dari daftar karakter yang tersedia untuk kata sandi yang dihasilkan (mis. Digit saja, hanya huruf besar atau hanya huruf kecil, dll.)
sumber
Random
tidak aman secara kriptografis;System.Security.Cryptography.RNGCryptoServiceProvider
adalah pilihan yang lebih baik.Tujuan utama kode saya adalah:
Properti pertama dicapai dengan mengambil modulo nilai alfabet 64 bit. Untuk huruf kecil (seperti 62 karakter dari pertanyaan) ini menyebabkan bias diabaikan. Properti kedua dan ketiga dicapai dengan menggunakan
RNGCryptoServiceProvider
alih-alihSystem.Random
.(Ini adalah salinan jawaban saya untuk Bagaimana saya bisa menghasilkan 8 karakter acak, string alfanumerik dalam C #? )
sumber
(Anda juga dapat memiliki kelas tempat metode ini menerapkan IDisposable, tahan referensi ke
RNGCryptoServiceProvider
, dan membuangnya dengan benar, untuk menghindari berulang kali instantiate itu.)Telah dicatat bahwa saat ini mengembalikan string base-64, panjang output selalu kelipatan 4, dengan ruang tambahan menggunakan
=
sebagai karakter padding. Thelength
parameter menentukan panjang buffer byte, bukan string output (dan oleh karena itu mungkin bukan nama yang terbaik untuk parameter itu, sekarang aku berpikir tentang hal). Ini mengontrol berapa banyak byte entropi kata sandi yang akan dimiliki. Namun, karena base-64 menggunakan blok 4-karakter untuk mengkodekan setiap 3 byte input, jika Anda meminta panjang yang bukan kelipatan 3, akan ada beberapa "ruang" tambahan, dan itu akan digunakan=
untuk mengisi tambahan.Jika Anda tidak suka menggunakan string base-64 karena alasan apa pun, Anda dapat mengganti
Convert.ToBase64String()
panggilan dengan konversi ke string biasa, atau denganEncoding
metode apa pun ; misalnya.Encoding.UTF8.GetString(tokenBuffer)
- pastikan Anda memilih rangkaian karakter yang dapat mewakili rentang nilai penuh yang keluar dari RNG, dan yang menghasilkan karakter yang kompatibel dengan di mana pun Anda mengirim atau menyimpan ini. Menggunakan Unicode, misalnya, cenderung memberi banyak karakter Cina. Menggunakan base-64 menjamin serangkaian karakter yang kompatibel secara luas, dan karakteristik string seperti itu seharusnya tidak membuatnya kurang aman selama Anda menggunakan algoritma hashing yang layak.sumber
Ini jauh lebih besar, tapi saya pikir itu terlihat sedikit lebih komprehensif: http://www.obviex.com/Samples/Password.aspx
sumber
Saya tahu ini adalah utas lama, tetapi saya memiliki apa yang mungkin merupakan solusi yang cukup sederhana untuk digunakan seseorang. Mudah diimplementasikan, mudah dimengerti, dan mudah divalidasi.
Pertimbangkan persyaratan berikut:
Ekspresi reguler berikut dapat memvalidasi kasus ini:
Itu di luar ruang lingkup pertanyaan ini - tetapi regex didasarkan pada lookahead / lookbehind dan lookaround .
Kode berikut akan membuat serangkaian karakter acak yang cocok dengan persyaratan ini:
Untuk memenuhi persyaratan di atas, cukup hubungi yang berikut ini:
Kode dimulai dengan karakter yang tidak valid (
"!"
) - sehingga string memiliki panjang untuk memasukkan karakter baru.Itu kemudian loop dari 1 ke # karakter huruf kecil yang diperlukan, dan pada setiap iterasi, ambil item acak dari daftar huruf kecil, dan menyuntikkannya di lokasi acak dalam string.
Itu kemudian mengulangi loop untuk huruf besar dan angka.
Ini memberi Anda kembali string panjang =
lowercase + uppercase + numerics
ke mana karakter huruf kecil, huruf besar dan numerik dari jumlah yang Anda inginkan telah ditempatkan dalam urutan acak.sumber
System.Random
untuk hal-hal penting keamanan seperti kata sandi. GunakanRNGCryptoServiceProvider
lowers[random.Next(lowers.Length - 1)].ToString()
Kode ini tidak akan pernah menghasilkan 'z'. acak. Berikutnya menghasilkan bilangan bulat kurang dari jumlah yang disediakan, jadi Anda tidak harus mengurangi yang ekstra dari panjangnya.Untuk jenis kata sandi ini, saya cenderung menggunakan sistem yang cenderung menghasilkan kata sandi "bekas" yang lebih mudah. Pendek, sering terdiri dari fragmen yang dapat diucapkan dan beberapa angka, dan tanpa ambiguitas intercharacter (apakah itu 0 atau O? A 1 atau I?). Sesuatu seperti
(Diketik langsung di browser, jadi gunakan hanya sebagai pedoman. Juga, tambahkan lebih banyak kata).
sumber
Saya tidak suka kata sandi yang dibuat oleh Membership.GeneratePassword (), karena terlalu jelek dan memiliki terlalu banyak karakter khusus.
Kode ini menghasilkan kata sandi 10 digit tidak terlalu jelek.
Tentu, saya bisa menggunakan Regex untuk melakukan semua penggantian tetapi IMO ini lebih mudah dibaca dan dikelola.
sumber
Saya membuat kelas ini yang menggunakan RNGCryptoServiceProvider dan fleksibel. Contoh:
sumber
Saya membuat metode ini mirip dengan yang tersedia di penyedia keanggotaan. Ini berguna jika Anda tidak ingin menambahkan referensi web di beberapa aplikasi.
Ini bekerja dengan baik.
sumber
System.Random
untuk hal-hal penting keamanan seperti kata sandi. GunakanRNGCryptoServiceProvider
Saya selalu sangat senang dengan generator kata sandi bawaan untuk KeePass. Karena KeePass adalah program .Net, dan open source, saya memutuskan untuk menggali sedikit kode. Saya akhirnya hanya merujuk KeePass.exe, salinan yang disediakan dalam instalasi aplikasi standar, sebagai referensi dalam proyek saya dan menulis kode di bawah ini. Anda dapat melihat betapa fleksibelnya ini berkat KeePass. Anda dapat menentukan panjang, karakter mana yang akan dimasukkan / tidak disertakan, dll ...
sumber
sumber
Saya akan menambahkan jawaban keliru lainnya ke pot.
Saya memiliki kasus penggunaan di mana saya memerlukan kata sandi acak untuk komunikasi mesin-mesin, jadi saya tidak memiliki persyaratan untuk keterbacaan manusia. Saya juga tidak memiliki akses ke
Membership.GeneratePassword
dalam proyek saya, dan tidak ingin menambahkan ketergantungan.Saya cukup yakin
Membership.GeneratePassword
melakukan sesuatu yang mirip dengan ini, tetapi di sini Anda dapat mengatur kumpulan karakter untuk menggambar.Dan beberapa contoh output:
Untuk mencegah keluhan tentang penggunaan
Random
: Sumber utama keacakan adalah RNG crypto. Bahkan jika Anda dapat menentukan terlebih dahulu urutan keluar dariRandom
(katakan itu hanya diproduksi1
), Anda masih tidak akan tahu karakter berikutnya yang akan dipilih (meskipun itu akan membatasi berbagai kemungkinan).Satu ekstensi sederhana adalah dengan menambahkan bobot ke set karakter yang berbeda, yang bisa sesederhana menaikkan nilai maksimal dan menambahkan kasing jatuh untuk menambah bobot.
Untuk pembuat kata sandi acak yang lebih humanistik, saya pernah menerapkan sistem yang cepat menggunakan daftar kata dadu EFF .
sumber
Saya suka melihat cara membuat kata sandi, seperti halnya membuat kunci perangkat lunak. Anda harus memilih dari serangkaian karakter yang mengikuti praktik yang baik. Ambil apa yang dijawab @ Radu094 dan modifikasi untuk mengikuti praktik yang baik. Jangan letakkan setiap huruf di dalam array karakter. Beberapa surat lebih sulit diucapkan atau dipahami melalui telepon.
Anda juga harus mempertimbangkan untuk menggunakan checksum pada kata sandi yang dibuat untuk memastikan bahwa itu dihasilkan oleh Anda. Cara yang baik untuk mencapai ini adalah dengan menggunakan algoritma LUHN .
sumber
Inilah yang saya kumpulkan dengan cepat.
sumber
Saya menggunakan kode ini untuk menghasilkan kata sandi dengan komposisi keseimbangan karakter alfabet, numerik dan non_alpha_numeric.
sumber
Ini singkat dan itu sangat bagus untuk saya.
sumber
Di situs web saya, saya menggunakan metode ini:
Edit string
_SymbolsAll
untuk daftar array Anda.sumber
Menambahkan beberapa kode tambahan ke jawaban yang diterima. Ini meningkatkan jawaban hanya menggunakan Acak dan memungkinkan untuk beberapa opsi kata sandi. Saya juga menyukai beberapa opsi dari jawaban KeePass tetapi tidak ingin menyertakan yang dapat dieksekusi dalam solusi saya.
Ini adalah tautan pertama ketika saya mencari untuk menghasilkan kata sandi acak dan berikut ini di luar ruang lingkup untuk pertanyaan saat ini tetapi mungkin penting untuk dipertimbangkan.
System.Web.Security.Membership.GeneratePassword
secara kriptografi aman dengan minimum 20% dari karakter menjadi Non-Alfanumerik.sumber
validChars dapat berupa konstruksi apa pun, tetapi saya memutuskan untuk memilih berdasarkan rentang kode ascii menghapus chars kontrol. Dalam contoh ini, ini adalah string 12 karakter.
sumber
sumber
Random
sebagai statisPaket ini memungkinkan Anda untuk membuat kata sandi acak sambil dengan lancar menunjukkan karakter yang harus dikandungnya (jika perlu):
https://github.com/prjseal/PasswordGenerator/
Contoh:
sumber
Jika Anda ingin menggunakan pembuatan nomor acak kriptografi aman yang digunakan oleh System.Web.Security.Membership.GeneratePassword tetapi juga ingin membatasi set karakter ke karakter alfanumerik, Anda dapat memfilter hasilnya dengan regex:
sumber
sumber
Masukkan Timer: timer1, 2 tombol: button1, button2, 1 textBox: textBox1, dan comboBox: comboBox1. Pastikan Anda menyatakan:
Kode sumber:
sumber
System.Random
untuk keamanan.