Baru -baru ini, kode verifikasi geser secara bertahap menjadi populer di banyak situs web. Di satu sisi, ini relatif baru untuk pengalaman pengguna dan mudah dioperasikan. Di sisi lain, keamanan belum sangat berkurang dibandingkan dengan kode verifikasi grafis. Tentu saja, sejauh ini, tidak ada verifikasi keamanan absolut, tetapi hanya meningkatkan biaya bypass untuk penyerang.
Selanjutnya, analisis proses inti kode verifikasi geser:
Secara acak menghasilkan guntingan dan gambar latar belakang dengan bayangan guntingan pada backend, dan menyimpan koordinat posisi guntingan acak di latar belakang.
Front-end mewujudkan interaksi geser, menempatkan potongan pada bayangan guntingan, dan memperoleh nilai jarak geser pengguna, seperti contoh berikut
Front-end melewati nilai jarak geser pengguna ke back-end, dan back-end memeriksa apakah kesalahan berada dalam kisaran yang diijinkan.
Di sini, cukup memverifikasi jarak geser pengguna adalah verifikasi paling dasar. Untuk alasan keamanan yang lebih tinggi, seluruh lintasan geser pengguna, perilaku akses pengguna pada halaman saat ini, dll. Juga dapat dipertimbangkan. Ini bisa rumit, dan bahkan dengan bantuan model analisis data perilaku pengguna, tujuan utamanya adalah untuk meningkatkan kesulitan simulasi ilegal dan melewati. Ini adalah peluang yang dapat diringkas dan diringkasnya metode yang umum digunakan. Artikel ini berfokus pada cara menghasilkan kode verifikasi geser langkah demi langkah berdasarkan Java.
Dapat dilihat bahwa kode verifikasi grafik geser terdiri dari dua gambar penting, pemotongan blok dan gambar asli dengan blok cutting shadow. Ada dua fitur penting di sini untuk memastikan kesulitan dipaksakan secara brutal: bentuk pemotongan blok dan posisi gambar asli di mana blok berada acak. Hal ini memungkinkan pasangan guntingan acak yang ditemukan secara tidak teratur dan gambar asli dibuat dalam satu set gambar terbatas.
Bagaimana cara menggunakan kode untuk mengekstrak gambar kecil dengan bentuk acak tertentu dari gambar besar?
Langkah pertama adalah menentukan garis besar gambar guntingan untuk memfasilitasi eksekusi yang sebenarnya dari operasi pemrosesan gambar di masa depan.
Gambar ini terdiri dari piksel, dan setiap titik piksel sesuai dengan warna. Warna dapat direpresentasikan dalam bentuk RGB, ditambah transparansi, dan memahami gambar sebagai figur pesawat, dengan sudut kiri atas sebagai asal, ke sumbu x kanan, dan pada sumbu-y bawah, nilai koordinat sesuai dengan warna titik piksel pada posisi yang sesuai, sehingga gambar dapat dikonversi menjadi array dua dimensi. Berdasarkan pertimbangan ini, garis besar juga diwakili oleh array dua dimensi, dengan nilai elemen di dalam garis besar adalah 1, dan nilai elemen di luar garis besar adalah 0.
Pada saat ini, Anda harus memikirkan cara menghasilkan bentuk garis besar ini. Ada sistem koordinat, persegi panjang, dan lingkaran. Ya, fungsi grafis matematika digunakan. Biasanya, fungsi menggunakan persamaan fungsi lingkaran dan fungsi garis samping persegi panjang, mirip dengan:
Dalam (xa) ²+(yb) ² = r², ada tiga parameter a, b, dan r, yaitu koordinat pusat adalah (a, b) dan jari -jari r. Guntingan ini ditempatkan pada sistem koordinat yang dijelaskan di atas dan mudah untuk menghitung nilai spesifik dari grafik.
Kode sampel adalah sebagai berikut:
private int [] [] getBlockData () {int [] [] data = int baru [targetLength] [targetWidth]; double x2 = TargetLength-Circler-2; // Posisi lingkaran yang dihasilkan secara acak double h1 = circler + math.random () * (targetWidth-3 * circler-r1); Double PO = Circler*Circler; double xbegin = targetlength-circler-r1; double ybegin = targetWidth-circler-r1; untuk (int i = 0; i <targetLength; i ++) {for (int j = 0; j <targetWidth; j ++) {// kanan ○ ganda d3 = math.pow (i - x2,2)+math.pow (j - h1,2); if (d1 <= po || (j> = ybegin && d2> = po) || (i> = xbegin && d3> = po)) {data [i] [j] = 0; } else {data [i] [j] = 1; }}} mengembalikan data; }Langkah kedua adalah bahwa setelah garis besar ini, Anda dapat menentukan guntingan berdasarkan nilai array dua dimensi ini dan menambahkan bayangan ke posisi guntingan pada gambar asli.
Operasi adalah sebagai berikut:
private void cutbytemplate (bufferedImage oriimage, targetImage buferedImage, int [] [] templateImage, int x, int y) {for (int i = 0; i <targetLength; i ++) {for (int j = 0; j <targetwidth; j ++) {int rgb = TemplateMage (target] [j targetwidth; j ++) {int rgb = TemplateMage [ // proses perubahan warna warna pada posisi yang sesuai di gambar asli int rGB_ori = oriimage.getrgb (x + i, y + j); if (rgb == 1) {// salin nilai warna yang sesuai pada targetimage gambar cutout.setrgb (i, y + j, rgb_ori); int r = (0xff & rgb_ori); int g = (0xff & (rgb_ori >> 8)); int b = (0xff & (rgb_ori >> 16))); rgb_ori = r + (g << 8) + (b << 16) + (200 << 24); // Perubahan warna dari posisi yang sesuai dari gambar asli oriimage.setrgb (x + i, y + j, rgb_ori); }}}}Setelah dua langkah pertama, Anda akan mendapatkan guntingan dan gambar aslinya dengan cutout shadow. Untuk meningkatkan kebingungan dan meningkatkan efek pemuatan jaringan, pemrosesan gambar lebih lanjut juga diperlukan. Secara umum, ada dua hal yang harus dilakukan. Salah satunya adalah mengaburkan gambar dan meningkatkan kesulitan pengenalan mesin, dan yang lainnya adalah melakukan kompresi yang sesuai dengan kualitas yang sama. Pemrosesan fuzzy mudah dipikirkan tentang kekaburan Gaussian, dan prinsipnya mudah dimengerti. Anda dapat pergi ke Google untuk mempelajarinya. Khusus untuk implementasi Java, ada banyak versi. Sekarang, tidak ada toples pihak ketiga untuk memberikan contoh:
public static convolveop getgaussianblurfilter (int radius, boolean horizontal) {if (radius <1) {lempar baru ilegalargumentException ("radius harus menjadi> = 1"); } int size = radius * 2 + 1; float [] data = float baru [ukuran]; float sigma = radius / 3.0f; float twosigmasquare = 2.0f * sigma * sigma; float sigmaroot = (float) math.sqrt (twosigmasquare * math.pi); total float = 0,0f; untuk (int i = -radius; i <= radius; i ++) {float jarak = i * i; INT INDEX = I + RADIUS; data [indeks] = (float) math.exp (-distance / twosigmasquare) / sigmaroot; Total += data [indeks]; } untuk (int i = 0; i <data.length; i ++) {data [i] /= total; } Kernel kernel = null; if (horizontal) {kernel = kernel baru (ukuran, 1, data); } else {kernel = kernel baru (1, ukuran, data); } return new convolveop (kernel, convolveop.edge_no_op, null); } public static void SimpleBlur (BufferedImage SRC, BufferedImage Dest) {bufferedImageop op = getgaussianblurfilter (2, false); op.filter (src, dest); }Efek kaburnya sangat baik setelah pengujian. Selain itu, ini adalah kompresi gambar, dan tidak ada alat pihak ketiga yang digunakan untuk melakukan kompresi yang homogen.
byte statis publik [] frombufferedImage2 (bufferedimage img, string imagetype) melempar ioException {bos.reset (); // Dapatkan penulis iterator <mageWriter> iter = imageo.getimagewritersByFormatname (imageType); Imagewriter writer = (Imagewriter) iter.next (); // Dapatkan pengaturan parameter output dari penulis yang ditentukan (ImagewRitEparam) ImagewRitEparam IWP = writer.getDefaultWriteParam (); IWP.SetCompressionMode (ImagewRitEparam.Mode_Explicit); // atur apakah akan mengompres IWP.SetCompressionquality (1F); // atur parameter kualitas kompresi IWP.SetProgressiveMode (ImagewRitEparam.mode_disabled); Colormodel colormodel = colormodel.getrgbdefault (); // Tentukan mode warna yang digunakan selama kompresi IWP.SetDestinationType (baru javax.imageio.imagetypespecifier (colormodel, colormodel.createCompatiblesamplemodel (16, 16))); writer.setOutput (Imageo .CreateMageOutputStream (BOS)); IioImage iiamge = iioImage baru (img, null, null); writer.write (null, iiamge, IWP); byte [] d = bos.tobytearray (); kembali D; }Pada titik ini, proses pemrosesan kode dari inti kode verifikasi geser telah selesai. Ada banyak detail yang dapat terus dipoles dan dioptimalkan, sehingga pengalaman geser bisa lebih baik. Saya berharap ini dapat membantu beberapa siswa yang bersiap untuk membangun kode verifikasi geser mereka sendiri.
Implementasi kode di atas sangat halus. Di satu sisi, untuk memastikan kinerja, dan di sisi lain, mudah dimengerti. Selain itu, karena berbagai alasan, tidak nyaman untuk memperkenalkan terlalu banyak detail. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Setelah pengujian, waktu respons proses pembuatan grafik geser dapat dikontrol sekitar 20 ms. Jika resolusi gambar asli di bawah 300px*150px, ia dapat mencapai sekitar 10 ms, yang berada dalam kisaran yang dapat diterima. Jika ada cara yang lebih efisien, saya berharap dapat memberi saya beberapa nasihat. Saya juga berharap semua orang akan lebih mendukung wulin.com.