Bagaimana mungkin menghasilkan string acak dan unik menggunakan angka dan huruf untuk digunakan dalam tautan verifikasi? Seperti ketika Anda membuat akun di situs web, dan itu mengirimi Anda email dengan tautan, dan Anda harus mengklik tautan itu untuk memverifikasi akun Anda ... ya ... salah satunya.
Bagaimana saya bisa menghasilkan salah satu dari mereka yang menggunakan PHP?
Pembaruan: Baru diingat tentang uniqid()
. Ini adalah fungsi PHP yang menghasilkan pengidentifikasi unik berdasarkan waktu saat ini dalam mikrodetik. Saya pikir saya akan menggunakannya.
php
string
random
uniqueidentifier
Andrew
sumber
sumber
Scott
jawaban yang benar. Scott menggunakan generator nomor psudo-acak (CSPRNG) cryptographically secure openSSL yang akan memilih sumber entropi paling aman berdasarkan pada platform Anda.uniqid
tidak aman. Gunakan sesuatu sepertiRandom::alphanumericString($length)
atauRandom::alphanumericHumanString($length)
.Jawaban:
Jika Anda tidak perlu menjadi benar-benar unik dari waktu ke waktu:
md5(uniqid(rand(), true))
Jika tidak (mengingat Anda telah menentukan login unik untuk pengguna Anda):
sumber
Saya hanya mencari cara untuk memecahkan masalah yang sama ini, tetapi saya juga ingin fungsi saya membuat token yang dapat digunakan untuk pengambilan kata sandi juga. Ini berarti bahwa saya perlu membatasi kemampuan token untuk ditebak. Karena
uniqid
didasarkan pada waktu, dan menurut php.net "nilai kembali sedikit berbeda dari microtime ()",uniqid
tidak memenuhi kriteria. PHP merekomendasikan untuk menggunakanopenssl_random_pseudo_bytes()
sebagai gantinya untuk menghasilkan token yang aman secara kriptografis.Jawaban cepat, singkat dan to the point adalah:
yang akan menghasilkan string acak karakter alfanumerik dengan panjang = $ byte * 2. Sayangnya ini hanya memiliki alfabet
[a-f][0-9]
, tetapi berfungsi.Di bawah ini adalah fungsi terkuat yang bisa saya buat yang memenuhi kriteria (Ini adalah versi jawaban Erik yang diterapkan).
crypto_rand_secure($min, $max)
berfungsi sebagai pengganti pengganti untukrand()
ataumt_rand
. Ini menggunakan openssl_random_pseudo_bytes untuk membantu membuat angka acak antara $ min dan $ max.getToken($length)
membuat alfabet untuk digunakan dalam token dan kemudian membuat string panjang$length
.EDIT: Saya lalai mengutip sumber - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): Dengan dirilisnya PHP7, perpustakaan standar sekarang memiliki dua fungsi baru yang dapat menggantikan / meningkatkan / menyederhanakan fungsi crypto_rand_secure di atas.
random_bytes($length)
danrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Contoh:
sumber
base64_encode
alih-alihbin2hex
untuk mendapatkan string yang lebih pendek dengan alfabet yang lebih besar.Versi berorientasi objek dari solusi yang paling banyak dipilih
Saya telah membuat solusi berorientasi objek berdasarkan jawaban Scott :
Pemakaian
Alfabet khusus
Anda dapat menggunakan alfabet khusus jika diperlukan. Cukup berikan string dengan karakter yang didukung ke konstruktor atau setter:
Inilah sampel keluarannya
Saya harap ini akan membantu seseorang. Bersulang!
sumber
$obj = new RandomStringGenerator;
tetapi metode apa yang harus saya panggil? Terima kasih.generate
metode seperti pada contoh di atas. Cukup berikan bilangan bulat untuk menentukan panjang string yang dihasilkan.Custom Alphabet
tidak. Saya mendapat output kosong ketika saya gema. Pokoknya saya bahkan tidak yakin apa gunanya contoh 2Custom Alphabet
jadi saya pikir saya hanya tinggal dengan contoh pertama. Terima kasih.Saya terlambat tetapi saya di sini dengan beberapa data penelitian yang baik berdasarkan fungsi yang disediakan oleh jawaban Scott . Jadi saya membuat tetesan Digital Ocean hanya untuk pengujian otomatis selama 5 hari ini dan menyimpan string unik yang dihasilkan dalam database MySQL.
Selama periode pengujian ini, saya menggunakan 5 panjang yang berbeda (5, 10, 15, 20, 50) dan +/- 0,5 juta catatan dimasukkan untuk setiap panjang. Selama pengujian saya, hanya panjang 5 yang dihasilkan +/- 3K duplikat dari 0,5 juta dan panjang yang tersisa tidak menghasilkan duplikat apa pun. Jadi kita dapat mengatakan bahwa jika kita menggunakan panjang 15 atau lebih dengan fungsi Scott, maka kita dapat menghasilkan string unik yang sangat andal. Berikut adalah tabel yang menunjukkan data penelitian saya:
Pembaruan: Saya membuat aplikasi Heroku sederhana menggunakan fungsi-fungsi ini yang mengembalikan token sebagai respons JSON. Aplikasi ini dapat diakses di https://uniquestrings.herokuapp.com/api/token?length=15
Saya harap ini membantu.
sumber
Anda dapat menggunakan UUID (Pengidentifikasi Unik Semesta), dapat digunakan untuk tujuan apa pun, dari string otentikasi pengguna hingga id transaksi pembayaran.
UUID adalah angka 16-oktet (128-bit). Dalam bentuk kanoniknya, UUID diwakili oleh 32 digit heksadesimal, ditampilkan dalam lima kelompok yang dipisahkan oleh tanda hubung, dalam bentuk 8-4-4-4-12 untuk total 36 karakter (32 karakter alfanumerik dan empat tanda hubung).
// memanggil funtion
beberapa contoh output akan seperti:
semoga membantu seseorang di masa depan :)
sumber
Fungsi ini akan menghasilkan kunci acak menggunakan angka dan huruf:
Contoh output:
sumber
Saya menggunakan one-liner ini:
di mana panjang adalah panjang dari string yang diinginkan (habis dibagi 4, jika tidak maka akan dibulatkan ke nomor terdekat habis dibagi 4)
sumber
==
base64url_encode
dapat digunakan sebagai gantinya, lihat di sini: php.net/manual/en/function.base64-encode.phpGunakan kode di bawah ini untuk menghasilkan angka acak 11 karakter atau mengubah nomor sesuai kebutuhan Anda.
atau kita dapat menggunakan fungsi kustom untuk menghasilkan angka acak
sumber
substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstvwxyz', 36)), 0, 11);
mis. (dalam kode semu)
sumber
Inilah penghasil id unik utama untuk Anda. dibuat oleh saya.
Anda dapat menggemakan 'var' apa saja untuk id Anda sesuka Anda. tetapi $ mdun lebih baik, Anda dapat mengganti md5 ke sha1 untuk kode yang lebih baik tetapi itu akan sangat lama yang mungkin tidak Anda butuhkan.
Terima kasih.
sumber
Untuk string yang benar-benar acak, Anda dapat menggunakannya
output:
jadi bahkan jika Anda mencoba untuk menghasilkan string beberapa kali pada waktu yang sama, Anda akan mendapatkan hasil yang berbeda.
sumber
Saat mencoba membuat kata sandi acak, Anda mencoba untuk:
Pertama-tama buat satu set byte acak yang aman secara kriptografis
Kedua adalah mengubah byte acak tersebut menjadi string yang dapat dicetak
Sekarang, ada beberapa cara untuk menghasilkan byte acak di php seperti:
Maka Anda ingin mengubah byte acak ini menjadi string yang dapat dicetak:
Anda dapat menggunakan bin2hex :
atau base64_encode :
Namun, perhatikan bahwa Anda tidak mengontrol panjang string jika Anda menggunakan base64. Anda dapat menggunakan bin2hex untuk melakukan itu, menggunakan 32 byte akan berubah menjadi string 64 char . Tapi itu hanya akan berfungsi seperti itu dalam string BAHKAN .
Jadi pada dasarnya Anda bisa melakukannya :
sumber
Inilah yang saya gunakan:
sumber
sumber
Ini adalah fungsi sederhana yang memungkinkan Anda menghasilkan string acak yang mengandung Letters and Numbers (alfanumerik). Anda juga dapat membatasi panjang string. String acak ini dapat digunakan untuk berbagai keperluan, termasuk: Kode Rujukan, Kode Promosi, Kode Kupon. Fungsi bergantung pada fungsi PHP berikut: base_convert, sha1, uniqid, mt_rand
sumber
setelah membaca contoh sebelumnya saya datang dengan ini:
Saya menduplikasi 10 kali array [0-9, AZ] dan mengacak elemen, setelah saya mendapatkan titik awal acak untuk substr () menjadi lebih 'kreatif' :) Anda dapat menambahkan [az] dan elemen lainnya ke array, duplikat lebih atau kurang, lebih kreatif dari saya
sumber
Saya suka menggunakan kunci hash saat menangani tautan verifikasi. Saya akan merekomendasikan menggunakan microtime dan hashing yang menggunakan MD5 karena seharusnya tidak ada alasan mengapa kunci harus sama karena hash didasarkan dari microtime.
$key = md5(rand());
$key = md5(microtime());
sumber
fungsi di atas akan menghasilkan Anda string acak yang panjangnya 11 karakter.
sumber
Jika Anda ingin membuat string unik di PHP, coba ikuti.
Di dalam,
uniqid()
- Ini akan menghasilkan string unik. Fungsi ini mengembalikan pengidentifikasi unik berbasis cap waktu sebagai string.mt_rand()
- Menghasilkan nomor acak.md5()
- Ini akan menghasilkan string hash.sumber
Scott, ya, Anda sangat menulis dan solusi yang bagus! Terima kasih.
Saya juga harus membuat token API unik untuk setiap pengguna saya. Berikut ini adalah pendekatan saya, saya menggunakan informasi pengguna (Userid dan Username):
Silakan lihat dan beri tahu saya jika ada perbaikan yang dapat saya lakukan. Terima kasih
sumber
Inilah yang saya gunakan pada salah satu proyek saya, ini bekerja dengan baik dan menghasilkan TOKEN ACAK UNIK :
Harap perhatikan bahwa saya mengalikan cap waktu dengan tiga untuk membuat kebingungan bagi siapa pun pengguna yang mungkin bertanya-tanya bagaimana token ini dihasilkan;)
Saya harap ini membantu :)
sumber
Saya pikir ini adalah metode terbaik untuk digunakan.
sumber
kita dapat menggunakan dua baris kode ini untuk menghasilkan string unik yang telah diuji sekitar 10.000.000 kali iterasi
sumber
Saya selalu menggunakan fungsi ini untuk menghasilkan string alfanumerik acak khusus ... Semoga bantuan ini.
Ini menghasilkan misalnya: Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86g
Jika Anda ingin membandingkan dengan string lain untuk memastikan itu adalah urutan unik, Anda dapat menggunakan trik ini ...
itu menghasilkan dua string unik:
qsBDs4JOoVRfFxyLAOGECYIsWvpcpMzAO9pypwxsqPKeAmYLOi
Ti3kE1WfGgTNxQVXtbNNbhhvvapnaUfGMVJecHkUjHbuCb85pF
Semoga ini yang Anda cari ...
sumber
Solusi sederhana adalah mengubah basis 64 menjadi alfanumerik dengan membuang karakter non-alfanumerik.
Yang ini menggunakan random_bytes () untuk hasil yang aman secara kriptografis.
sumber
Saya pikir ini solusi yang lebih baik
sumber
Saya percaya masalah dengan semua ide yang ada adalah bahwa mereka mungkin unik, tetapi tidak pasti unik (seperti yang ditunjukkan dalam balasan Dariusz Walczak kepada loletech). Saya punya solusi yang sebenarnya unik. Ini mengharuskan skrip Anda memiliki semacam memori. Bagi saya ini adalah database SQL. Anda juga bisa menulis ke file di suatu tempat. Ada dua implementasi:
Metode pertama: memiliki DUA bidang daripada 1 yang memberikan keunikan. Bidang pertama adalah nomor ID yang tidak acak tetapi unik (ID pertama adalah 1, 2 kedua ...). Jika Anda menggunakan SQL, cukup tentukan bidang ID dengan properti AUTO_INCREMENT. Kolom kedua tidak unik tetapi acak. Ini dapat dihasilkan dengan salah satu teknik lain yang telah disebutkan orang. Ide Scott bagus, tetapi md5 nyaman dan mungkin cukup baik untuk sebagian besar tujuan:
Metode kedua: Pada dasarnya ide yang sama, tetapi pada awalnya memilih jumlah maksimum string yang pernah dihasilkan. Ini bisa menjadi jumlah yang sangat besar seperti satu triliun. Kemudian lakukan hal yang sama, buat ID, tapi nol padatkan sehingga semua ID memiliki jumlah digit yang sama. Kemudian gabungkan ID dengan string acak. Ini akan cukup acak untuk sebagian besar tujuan, tetapi bagian ID akan memastikan bahwa itu juga unik.
sumber
Anda dapat menggunakan kode ini, semoga bermanfaat bagi Anda.
Rincian tentang pembuat kode acak dalam PHP
sumber
Menyederhanakan kode Scotts di atas dengan menghapus loop yang tidak perlu yang memperlambat dengan buruk dan tidak membuatnya lebih aman daripada memanggil openssl_random_pseudo_bytes sekali saja
sumber
openssl
tidak menyebabkan ini, itu karena bias modulo dalam pernyataan pengembalian Anda. 100 (rentang) tidak membagi 255 (1 byte) secara merata dan menyebabkan hasil ini. Masalah terbesar saya dengan jawaban Anda adalah bahwa Anda menyatakan bahwa fungsinya seaman menggunakan loop, yang salah. Implementasi crypto_rand_secure Anda tidak aman secara kriptografis dan menyesatkan.openssl
lebih aman, tetapi yang lebih penting itu tidak membuatnya kurang aman, jawaban ini tidak. Kode di atas mengambil angka acak yang sangat bagus dan mengubahnya dengan membiaskannya ke angka yang lebih rendah. Jika Anda meletakkan penafian jawaban Anda yang menyatakan bahwa itu lebih cepat (dengan menghapus loop) tetapi itu bukan CSPRNG itu akan menyelesaikan masalah ini. Tolong, untuk cinta crypto, beri tahu pengguna bahwa output dari fungsi ini bisa menjadi bias dan bukan solusi yang setara. Pengulangan itu tidak hanya mengganggu Anda.