Saya mencoba membuat string acak dalam PHP, dan saya sama sekali tidak mendapatkan output dengan ini:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
Apa yang saya lakukan salah?
strlen($characters)
=>strlen($characters) - 1
- panjang string dimulai dengan 1Jawaban:
Untuk menjawab pertanyaan ini secara khusus, dua masalah:
$randstring
tidak ada dalam ruang lingkup saat Anda menggemakannya.Berikut cuplikan kode dengan koreksi:
Keluarkan string acak dengan panggilan di bawah ini:
sumber
substr(str_shuffle(MD5(microtime())), 0, 10);
?rand()
kemt_rand()
. Saya menggunakan metode Anda dan mengalami banyak tabrakan dengan nama.Satu lagi jalan.
DIPERBARUI (sekarang ini menghasilkan string apa pun):
Itu dia. :)
sumber
Ada banyak jawaban untuk pertanyaan ini, tetapi tidak satupun dari mereka yang memanfaatkan Pseudo-Random Number Generator (CSPRNG) Cryptographically Secure .
Jawaban sederhana, aman, dan benar adalah dengan menggunakan RandomLib dan jangan menemukan kembali kemudi.
Bagi Anda yang bersikeras 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 5 untukrandom_int()
sehingga Anda dapat menggunakan API baru bahkan sebelum Anda meningkatkan ke PHP 7.Menghasilkan bilangan bulat acak dengan aman di PHP bukanlah tugas yang sepele. Anda harus selalu berkonsultasi dengan pakar kriptografi StackExchange tempat tinggal Anda sebelum menerapkan algoritme buatan sendiri dalam produksi.
Dengan generator integer yang aman, menghasilkan string acak dengan CSPRNG adalah jalan-jalan di taman.
Membuat String yang Aman dan Acak
Penggunaan :
Demo : https://3v4l.org/IMJGF (Abaikan kegagalan PHP 5; perlu random_compat)
sumber
$keyspace = str_shuffle($keyspace );
untuk keamanan yang lebihrandom_int()
alih-alihrand()
ataumt_rand()
tidak menambah kerumitan bagi pengembang. Pada saat yang sama, itu memberi mereka keamanan yang lebih besar. Orang-orang yang datang ke StackOverflow mencari solusi cepat mungkin tidak tahu apakah benda yang mereka bangun perlu aman atau tidak. Jika kami memberi mereka jawaban aman secara default, mereka menciptakan Internet yang lebih aman walaupun, dari sudut pandang mereka, itu benar-benar kebetulan. Mengapa Anda menentang tujuan ini adalah misteri bagi saya.Ini menciptakan string heksadesimal sepanjang 20 karakter:
Dalam PHP 7 ( random_bytes () ):
sumber
openssl_random_pseudo_bytes()
tidak menggunakan algoritma yang kuat secara kriptografis sampai php 5.6. Bug terkait: bugs.php.net/bug.php?id=70014openssl_random_pseudo_bytes()
Anda tidak akan mendapatkan apa-apa. Juga, perhatikan bahwa ketika menggunakanbin2hex(openssl_random_pseudo_bytes($length / 2))
karena Anda bekerja dengan bilangan bulat, itu akan secara otomatis menghapus modulo dan akan menggunakan kelipatan terendah berikutnya 2. Jadi,$length = 19
akan menghasilkan string dengan panjang 18.fgets($fp, 1024)
dan setiap editor file yang memiliki masalah dengan garis yang sangat panjang:function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }
Setel$split
kenull
jika harus mengembalikan satu-baris. Dengan itu Anda dapat menggunakannya untuk kedua kasus.$string = substr(base64_encode(random_bytes($size)), 0, $size);
@tasmaniski: jawaban Anda berhasil untuk saya. Saya memiliki masalah yang sama, dan saya akan menyarankannya untuk mereka yang pernah mencari jawaban yang sama. Ini dia dari @tasmaniski:
Ini adalah video youtube yang menunjukkan kepada kita cara membuat angka acak
sumber
md5
akan menghasilkan batas 30 karakter dan selalu huruf kecil.md5(rand())
hanya menawarkan 2 ^ 32 nilai yang memungkinkan. Ini berarti setelah, rata-rata, 2 ^ 16 string acak Anda akan mengharapkan satu untuk mengulangi.Bergantung pada aplikasi Anda (saya ingin menghasilkan kata sandi), Anda dapat menggunakannya
Menjadi base64, mereka dapat berisi
=
atau-
juga karakter yang diminta. Anda dapat membuat string yang lebih panjang, lalu filter dan potong untuk menghilangkannya.openssl_random_pseudo_bytes
tampaknya menjadi cara yang disarankan untuk menghasilkan angka acak yang tepat di php. Kenaparand
tidak pakai/dev/random
saya tidak tahu.sumber
openssl_random_pseudo_bytes()
adalah portable.Berikut ini adalah satu-liner sederhana yang menghasilkan string acak yang benar tanpa perulangan level script atau penggunaan pustaka OpenSSL.
Untuk memecahnya sehingga parameternya jelas
Metode ini bekerja dengan mengulangi daftar karakter secara acak, kemudian mengocok string gabungan, dan mengembalikan jumlah karakter yang ditentukan.
Anda selanjutnya dapat mengacak ini, dengan mengacak panjang string yang dikembalikan, menggantikannya
$chrRandomLength
denganmt_rand(8, 15)
(untuk string acak antara 8 dan 15 karakter).sumber
$chrRepeatMax
dan$chrRepeatMin
) - jadi string char 10, bisa (tidak mungkin, tetapi mungkin), menjadi "aaaaaaaaaa".Tada!
sumber
sha1
akan menghasilkan batas 40 karakter dan selalu huruf kecil.rant()
yang acak tidak masalah ketika dia tidak merata. Jika Anda memilih secara acak dari distribusi yang tidak rata, Anda mendapatkan distribusi yang tidak merata sama persis. Ini bukan keacakan "crypto level" yang saya soroti, jika itu masalahnya Anda tidak harus menggunakanrand()
keduanya. Dibutuhkan upaya minimal untuk memetik dari distribusi yang merata seperti dalam jawaban yang diterima dan itu acak seperti rand () yang memang wajar.Cara yang lebih baik untuk mengimplementasikan fungsi ini adalah:
mt_rand
lebih acak menurut ini dan ini di PHP 7.rand
Fungsi ini adalah aliasmt_rand
.sumber
mt_rand
tidak menghasilkan nilai yang aman secara kriptografis. Untuk itu Anda harus menggunakan PHP7random_int
ataurandom_bytes
.$randstring
dalam lingkup fungsi tidak sama dengan ruang lingkup tempat Anda memanggilnya. Anda harus menetapkan nilai kembali ke variabel.Atau langsung gandakan nilai kembali:
Juga, dalam fungsi Anda, Anda memiliki sedikit kesalahan. Di dalam for loop, Anda perlu menggunakan
.=
agar setiap karakter ditambahkan ke string. Dengan menggunakan=
Anda menimpanya dengan setiap karakter baru alih-alih menambahkan.sumber
Pertama, Anda mendefinisikan alfabet yang ingin Anda gunakan:
Kemudian, gunakan
openssl_random_pseudo_bytes()
untuk menghasilkan data acak yang tepat:Akhirnya, Anda menggunakan data acak ini untuk membuat kata sandi. Karena setiap karakter di
$random
dapatchr(0)
sampaichr(255)
, kode menggunakan sisa setelah pembagian nilai ordinalnya dengan$alphabet_length
untuk memastikan hanya karakter dari alfabet yang dipilih (perhatikan bahwa melakukan hal itu bias keacakan):Atau, dan umumnya lebih baik, adalah dengan menggunakan RandomLib dan SecurityLib :
sumber
%
akan menghasilkan output yang bias. Namun, +1 kuat untuk RandomLib. Jangan menemukan kembali roda.Metode Pendek ..
Berikut adalah beberapa metode terpendek untuk menghasilkan string acak
sumber
Saya telah menguji kinerja fungsi paling populer di sana, waktu yang diperlukan untuk menghasilkan 1'000'000 string 32 simbol pada kotak saya adalah:
Harap dicatat, tidak penting berapa lama itu sebenarnya tetapi mana yang lebih lambat dan mana yang lebih cepat sehingga Anda dapat memilih sesuai dengan kebutuhan Anda termasuk kesiapan kriptografi, dll.
substr () sekitar MD5 ditambahkan demi akurasi jika Anda membutuhkan string yang lebih pendek dari 32 simbol.
Demi jawaban: string tidak disatukan tetapi ditimpa dan hasil fungsi tidak disimpan.
sumber
PHP 7+ Hasilkan byte acak yang aman secara kriptografis menggunakan fungsi random_bytes .
Output yang mungkin
PHP 5.3+ Hasilkan byte pseudo-acak menggunakan fungsi openssl_random_pseudo_bytes .
Output yang mungkin
The Kasus penggunaan terbaik bisa
Output yang mungkin
sumber
Salah satu cara yang sangat cepat adalah melakukan sesuatu seperti:
Ini akan menghasilkan string acak dengan panjang 10 karakter. Tentu saja, beberapa orang mungkin mengatakan itu sedikit lebih berat di sisi perhitungan, tetapi saat ini prosesor dioptimalkan untuk menjalankan algoritma md5 atau sha256 dengan sangat cepat. Dan tentu saja, jika
rand()
fungsi mengembalikan nilai yang sama, hasilnya akan sama, memiliki peluang 1/32767 menjadi sama. Jika keamanan adalah masalah, maka ubah sajarand()
kemt_rand()
sumber
sumber
Yang ini diambil dari sumber admin :
Adminer , alat manajemen basis data yang ditulis dalam PHP.
sumber
Fungsi pembantu dari kerangka Laravel 5
sumber
Sumber dari http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/
sumber
Versi fungsi yang diedit berfungsi dengan baik, tetapi hanya ada satu masalah yang saya temukan: Anda menggunakan karakter yang salah untuk menyertakan $ karakter, jadi karakter 'kadang-kadang bagian dari string acak yang dihasilkan.
Untuk memperbaiki ini, ubah:
untuk:
Dengan cara ini hanya karakter tertutup yang digunakan, dan karakter 'tidak akan pernah menjadi bagian dari string acak yang dihasilkan.
sumber
Satu garis lainnya, yang menghasilkan string acak 10 karakter dengan huruf dan angka. Ini akan membuat array dengan
range
(sesuaikan parameter kedua untuk mengatur ukuran), lompati array ini dan berikan karakter ASCII acak (rentang 0-9 atau az), kemudian implode array untuk mendapatkan string.Catatan: ini hanya berfungsi di PHP 5.3 dan yang lebih baru
sumber
rand(0, 57-48+122-97)<57-48?...:...
? :)Satu liner
Cepat untuk string besar dengan beberapa keunikan.
sumber
md5(rand())
adalah cara yang sangat tidak aman untuk menghasilkan angka acak.Sejak php7, ada fungsi random_bytes. https://www.php.net/manual/ru/function.random-bytes.php Jadi Anda dapat menghasilkan string acak seperti itu
sumber
Saya menyukai komentar terakhir yang menggunakan openssl_random_pseudo_bytes, tapi itu bukan solusi bagi saya karena saya masih harus menghapus karakter yang tidak saya inginkan, dan saya tidak bisa mendapatkan string set panjang. Inilah solusi saya ...
sumber
sumber
Inilah solusi satu baris sederhana saya untuk menghasilkan kata sandi acak ramah yang digunakan, tidak termasuk karakter yang mirip seperti "1" dan "l", "O" dan "0", dll ... di sini adalah 5 karakter tetapi Anda dapat dengan mudah ubah saja:
sumber
Ini solusi lain.
PS. Saya menggunakan PHP 7.2 di Ubuntu.
sumber
Cara lain untuk menghasilkan string acak di PHP adalah:
sumber
Inilah cara saya melakukannya untuk mendapatkan kunci acak unik unik:
Anda dapat menggunakan waktu () karena ini adalah cap waktu Unix dan selalu unik dibandingkan dengan acak lainnya yang disebutkan di atas. Anda kemudian dapat menghasilkan md5sum itu dan mengambil panjang yang Anda inginkan dari MD5 yang dihasilkan string . Dalam hal ini saya menggunakan 10 karakter, dan saya bisa menggunakan string yang lebih panjang jika saya ingin membuatnya lebih unik.
Saya harap ini membantu.
sumber
time()
jauh dari unik: itu akan mengembalikan nilai yang sama berulang-ulang sampai ujung kedua saat ini. Apa yang benar-benar memberikan beberapa keacakan di sini adalahstr_shuffle()
— sisa kode hanya mengurangi sampel untuk memilih karakter.time()
(itu hanya cap waktu), itu adalah sumber keacakan yang lemah.Parametrised one-liner hanya menggunakan fungsi asli PHP , bekerja sejak PHP 5.1.0
sumber