Saya mencoba membuat kata sandi acak di php.
Namun saya mendapatkan semua 'a dan tipe pengembaliannya adalah tipe array dan saya ingin itu menjadi string. Ada ide tentang cara memperbaiki kode?
Terima kasih.
function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
for ($i = 0; $i < 8; $i++) {
$n = rand(0, count($alphabet)-1);
$pass[$i] = $alphabet[$n];
}
return $pass;
}
/dev/random
sudah cukup karena pertanyaannya tidak meminta kata sandi " aman " (dan tidak boleh diedit untuk memuatnya karena akan mengubah arti pertanyaan aslinya). Meskipun saya semua untuk keamanan, saya pikir bom karpet ini tidak dipikirkan sepenuhnya. Seperti menggunakanmysql_*
, jawabannya masih valid, tetapi harus ditandai sebagai tidak aman. Mungkin ini adalah sesuatu yang SO perlu sertakan sebagai perangkat lunak tambahan - kemampuan untuk memperingatkan kode tidak aman?Jawaban:
Coba ini (gunakan
strlen
sebagai ganticount
, karenacount
pada senar selalu1
):Demo: http://codepad.org/UL8k4aYK
sumber
$pass .= $alphabet[$n]
.mt_rand
juga tidak lebih baik)openssl_random_pseudo_bytes()
digunakan sebagai gantirand()
TL; DR:
random_int()
dan diberikan dirandom_str()
bawah ini.random_int()
, gunakan random_compat .Penjelasan:
Karena Anda membuat kata sandi , Anda perlu memastikan bahwa kata sandi yang Anda hasilkan tidak dapat diprediksi, dan satu-satunya cara untuk memastikan properti ini hadir dalam implementasi Anda adalah dengan menggunakan generator nomor pseudorandom (CSPRNG) yang aman secara kriptografi aman .
Persyaratan untuk CSPRNG dapat disesuaikan untuk kasus umum string acak, tetapi tidak ketika keamanan terlibat.
Jawaban sederhana, aman, dan benar untuk pembuatan kata sandi di PHP adalah dengan menggunakan RandomLib dan jangan menemukan kembali roda. Perpustakaan ini telah diaudit oleh para pakar keamanan industri, dan juga saya.
Untuk pengembang yang lebih suka menciptakan solusi Anda sendiri, PHP 7.0.0 akan menyediakan
random_int()
untuk tujuan ini. Jika Anda masih menggunakan PHP 5.x, kami menulis polyfill PHP 5random_int()
agar Anda dapat menggunakan API baru sebelum PHP 7 dirilis. Menggunakanrandom_int()
polyfill kami mungkin lebih aman daripada menulis implementasi Anda sendiri.Dengan generator integer acak aman di tangan, menghasilkan string acak aman lebih mudah daripada pie:
sumber
mcrypt_*
fungsi. Saya dapat melihat pada utas masalah bahwa Anda telah memotong perpustakaan karena tidak bisa mendapatkan @ircmaxell, tetapi garpu Anda mengatakan 'build gagal' di Travis. Apakah Anda ingin memperbarui jawaban ini (yang masih muncul cukup tinggi di Google)?Saya tahu Anda mencoba membuat kata sandi dengan cara tertentu, tetapi Anda mungkin ingin melihat metode ini juga ...
Ini diambil dari situs php.net dan menciptakan string yang dua kali panjang dari angka yang Anda masukkan dalam fungsi openssl_random_pseudo_bytes. Jadi di atas akan membuat kata sandi sepanjang 4 karakter.
Pendeknya...
Panjang kata sandi akan dibuat 8 karakter.
Namun perlu dicatat bahwa kata sandi hanya berisi angka 0-9 dan huruf kecil af!
sumber
openssl_random_pseudo_bytes()
merupakan generator keacakan byte biner penuh yang kuat dan tidak perlu pengocokan lebih lanjut. Saya juga akan mengambil kesempatan untuk menunjukkan bahwa berbahaya untuk mengasumsikan susun beberapa metode enkripsi akan membuat sesuatu yang lebih acak, dalam beberapa kasus justru bisa menjadi sebaliknya karena akumulasi tabrakan hashing.Kode kecil dengan 2 baris.
demo: http://codepad.org/5rHMHwnH
sumber
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Jika Anda menggunakan PHP7, Anda bisa menggunakan
random_int()
fungsi ini:sumber
mt_rand
untuk menghasilkan kata sandi.mt_rand
, jadi masih tidak cocok untuk penggunaan keamanan apa pun.$chars
Dalam satu baris:
sumber
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Entropy dipulihkanTaruhan terbaik Anda adalah perpustakaan RandomLib oleh ircmaxell .
Contoh penggunaan:
Ini menghasilkan string yang lebih kuat acak daripada fungsi keacakan normal seperti
shuffle()
danrand()
(yang biasanya Anda inginkan untuk informasi sensitif seperti kata sandi, garam dan kunci).sumber
rand()
ataumt_rand()
.random_bytes
), tetapi itu tidak membuatrand
jawaban salah.rand
bukan pilihan yang baik untuk kata sandirand()
salah. Mereka semua salah sendiri!Anda inginkan
strlen($alphabet)
, bukancount
dari konstantaalphabet
(setara dengan'alphabet'
).Namun,
rand
bukan fungsi acak yang cocok untuk tujuan ini. Hasilnya dapat dengan mudah diprediksi karena secara implisit diunggulkan dengan waktu saat ini. Selain itu,rand
tidak aman secara kriptografis; Oleh karena itu relatif mudah untuk menentukan keadaan internal dari output.Sebagai gantinya, baca dari
/dev/urandom
untuk mendapatkan data acak kriptografis.sumber
Saya akan memposting jawaban karena beberapa jawaban yang ada sudah dekat tetapi ada satu:
Jawaban ini akan menghindari
count/strlen
masalah karena keamanan kata sandi yang dihasilkan, setidaknya IMHO, melampaui cara Anda sampai di sana. Saya juga akan menganggap PHP> 5.3.0.Mari kita pecahkan masalah menjadi beberapa bagian yaitu:
Untuk bagian pertama, PHP> 5.3.0 menyediakan fungsi
openssl_random_pseudo_bytes
. Perhatikan bahwa sementara sebagian besar sistem menggunakan algoritma kriptografi yang kuat, Anda harus memeriksa sehingga kami akan menggunakan pembungkus:Untuk bagian kedua, kita akan menggunakan
base64_encode
karena mengambil string byte dan akan menghasilkan serangkaian karakter yang memiliki alfabet yang sangat dekat dengan yang ditentukan dalam pertanyaan asli. Jika kami tidak keberatan memiliki+
,/
dan=
karakter muncul di string terakhir dan kami ingin hasil setidaknya$n
panjang karakter, kita bisa menggunakan:The
3/4
Faktor ini disebabkan oleh fakta bahwa base64 encoding menghasilkan string yang memiliki panjang setidaknya sepertiga lebih besar dari byte string yang. Hasilnya akan tepat untuk$n
menjadi kelipatan 4 dan hingga 3 karakter lebih lama. Karena karakter tambahan sebagian besar merupakan karakter padding=
, jika kita karena suatu alasan memiliki batasan bahwa kata sandi menjadi panjang yang tepat, maka kita dapat memotongnya sesuai dengan panjang yang kita inginkan. Ini terutama karena untuk yang diberikan$n
, semua kata sandi akan diakhiri dengan nomor yang sama, sehingga penyerang yang memiliki akses ke kata sandi hasil, akan memiliki hingga 2 karakter lebih sedikit untuk ditebak.Untuk kredit tambahan, jika kami ingin memenuhi spesifikasi persis seperti dalam pertanyaan OP maka kami harus melakukan sedikit lebih banyak pekerjaan. Saya akan melupakan pendekatan konversi basis di sini dan pergi dengan yang cepat dan kotor. Keduanya harus menghasilkan lebih banyak keacakan daripada yang akan digunakan dalam hasil karena 62 alfabet panjang entri.
Untuk karakter tambahan dalam hasil, kita bisa membuangnya dari string yang dihasilkan. Jika kita mulai dengan 8 byte dalam string-byte kita, maka hingga sekitar 25% dari karakter base64 akan menjadi karakter yang "tidak diinginkan" ini, sehingga dengan hanya membuang karakter ini menghasilkan string yang tidak lebih pendek dari yang diinginkan OP. Kemudian kita cukup memotongnya untuk mencapai panjang yang tepat:
Jika Anda menghasilkan kata sandi yang lebih panjang, karakter padding
=
membentuk proporsi hasil perantara yang lebih kecil dan lebih kecil sehingga Anda dapat menerapkan pendekatan yang lebih ramping, jika mengeringkan kumpulan entropi yang digunakan untuk PRNG menjadi perhatian.sumber
openssl_random_pseudo_bytes
bisa menghasilkan hasil yang lemah. Saya tidak menyadari bahwa itulah masalahnya.base_convert(uniqid('pass', true), 10, 36);
misalnya.
e0m6ngefmj4
EDIT
Seperti yang saya sebutkan di komentar, panjangnya berarti bahwa serangan brute force akan bekerja lebih baik terhadapnya daripada serangan waktu sehingga tidak benar-benar relevan untuk khawatir tentang "seberapa aman generator acak itu." Keamanan, khusus untuk kasus penggunaan ini, perlu melengkapi kegunaan sehingga solusi di atas sebenarnya cukup baik untuk masalah yang diperlukan.
Namun, untuk berjaga-jaga jika Anda menemukan jawaban ini saat mencari generator string acak yang aman (seperti yang saya asumsikan sebagian orang berdasarkan pada tanggapannya), untuk sesuatu seperti membuat token, berikut adalah tampilan generator kode-kode tersebut:
sumber
Satu lagi (hanya linux)
sumber
fread()
buffer ke 8192 byte secara default, jadi Anda akan selalu membaca sebanyak itu dari/dev/urandom
dengan kode yang diberikan. Ini juga tidak akan berfungsi pada Windows. Kudos untuk menggunakan CSPRNG, meskipun.Menjadi sedikit lebih pintar:
periksa di sini .
sumber
Gunakan kode sederhana ini untuk menghasilkan kata sandi yang kuat 12 panjang
sumber
Coba ini dengan Huruf Besar, Huruf Kecil, Numerik dan Karakter Khusus
Output Contoh:
, IZCQ_IV \ 7
@wlqsfhT (d
1! 8 + 1 \ 4 @ uD
sumber
rand
fungsi sebenarnya tidak cryptographically mengamankan sehingga mungkin cukup berisiko untuk menghasilkan password menggunakannyaSatu cepat Format sederhana, bersih dan konsisten jika itu yang Anda inginkan
sumber
Ini didasarkan pada jawaban lain pada halaman ini, https://stackoverflow.com/a/21498316/525649
Jawaban ini hanya menghasilkan karakter hex
0-9,a-f
,. Untuk sesuatu yang tidak terlihat seperti hex, coba ini:base64_encode
mengembalikan penyebaran karakter alfanumerik yang lebih luasrtrim
menghapus=
terkadang di akhirContoh:
32eFVfGDg891Be5e7293e54z1D23110M3ZU3FMjb30Z9a740Ej0jz4
b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760
051b33654C0Eg201cfW0e6NA4b9614ze8D2FN49E12Y0zY557aUCb8
y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7
Ini tidak dapat dikonfigurasi untuk membuat antarmuka untuk pengguna, tetapi untuk beberapa tujuan tidak apa-apa. Tambah jumlah karakter untuk menjelaskan kurangnya karakter khusus.
sumber
Sebut saja seperti di komentar.
sumber
Saya membuat skrip kata sandi yang lebih komprehensif dan aman. Ini akan membuat kombinasi dua huruf besar, dua huruf kecil, dua angka, dan dua karakter khusus. Total 8 karakter.
sumber
sumber
Menghasilkan kata sandi yang kuat dengan panjang 8 yang mengandung setidaknya satu huruf kecil, satu huruf besar, satu digit, dan satu karakter khusus. Anda dapat mengubah panjang kode juga.
sumber
Fungsi ini akan menghasilkan kata sandi berdasarkan aturan dalam parameter
sumber
Inilah pendapat saya tentang pembantu pembuatan kata sandi acak polos.
Ini memastikan bahwa kata sandi memiliki angka, huruf besar dan kecil serta minimal 3 karakter khusus.
Panjang kata sandi antara 11 dan 30.
sumber