Selanjutnya, artikel sebelumnya dari produksi kode verifikasi Java (Bagian 1) akan memperkenalkan Anda pada pengetahuan yang relevan tentang kode verifikasi Java!
Metode 3:
Diimplementasikan dengan komponen open source jcaptcha, dikombinasikan dengan pegas, dapat menghasilkan berbagai bentuk kode verifikasi. JCAPTCHA adalah Proyek Captcha versi Java. Ini adalah proyek open source yang mendukung pembuatan kode verifikasi untuk grafik dan versi suara. Saat menghasilkan kode verifikasi untuk versi suara, Freetts diperlukan. Nama lengkap Captcha yang sepenuhnya otomatis mengotori Turing Turing untuk membedakan komputer dan manusia yang pertama kali digunakan sebagai proyek penelitian ilmiah di Universitas Carnegie Mellon. Itu digunakan untuk menghasilkan tes yang mudah bagi manusia untuk lulus tetapi sulit untuk dilewati komputer. Saat ini banyak digunakan dalam aplikasi jaringan dan digunakan untuk mencegah robot dari menerbitkan informasi spam. Saat ini, situs web resmi JCAPTCHA menunjukkan bahwa ada versi 2.0, tetapi versi biner hanya versi 1.0 untuk diunduh.
Pertama, kita perlu menyiapkan paket JAR yang sesuai
Dalam implementasi proyek JCAPTCHA, ia juga merujuk dua proyek open source, commons-collection dan commons-gogging. Selain itu, implementasi JCAPTCHA itu sendiri, kami membutuhkan tiga paket secara total, dan informasi spesifiknya adalah sebagai berikut:
jcaptcha-2.0-all.jarcommons-gogging-1.1.1.jarcommons-collection-3.2.jar
Kedua, mari kita lihat informasi konfigurasi utama di web.xml di bawah ini: Selain mengkonfigurasi jalur kelas spesifik dari komponen JCAPTCHA, SubmitActionServlet juga dikonfigurasi, yang digunakan sebagai servlet untuk kode verifikasi perbandingan, dan keduanya dipetakan. Itu dapat dipahami sebagai mengubah namanya. Saat memanggil komponen atau servlet di /jcaptcha.jpg dan /submit.action, masing -masing, dapat digunakan langsung untuk menggunakan nama pemetaan ini.
<servlet> <servlet-name> jcaptcha </servlet-name> <servlet-class> com.octo.captcha.module.servlet.image.simpleimageCaptChaservlet </servlet-class> </servlet> <servlet> <servlet-name> Submit </servlet-name> <servlet-class> com.octo.captcha.module.servlet.image.sample.submitactionServlet </servlet-class> </servlet> <servlet-Mapping> <servlet-name> JCaptcha </servlet-name> <rerl-pola> /jcaptcha> <servlet-name> Kirim </servlet-name> <rerl-pattern> /submit.action </rerl-pattern> </servlet-mapping>
Web.xml
Kemudian mari kita lihat bagaimana SubmitActionServlet diimplementasikan: Karena paket komponen JCAPTCHA diimpor, metode yang dienkapsulasi SimpleImageCaptChaserVlet.validateresponse (permintaan, UserCaptCharesponse) secara langsung dipanggil untuk menentukan apakah informasi dalam kode verifikasi cocok dengan pengiriman, tanpa mempertimbangkan proses implementasi spesifik.
Kelas Publik SubmitActionServlet memperluas httpservlet {protected void dopost (httpservletRequest, respons httpservletResponse) melempar servletException, ioException {string usercaptcharesponse = request.getParameter ("japcha"); boolean captchapassed = SimpleImageCaptChaservlet.validateresponse (permintaan, usercaptcharesponse); if (captchapassed) response.getWriter (). tulis ("captcha lulus"); else {response.getWriter (). write ("captcha gagal"); } response.getWriter (). tulis ("<br/> <a href = 'index.jsp'> coba lagi </a>"); }} SubMitActionServlet Akhirnya, mari kita lihat panggilan meja depan yang sederhana:
<html> <hody> <h> sampel servlet captcha sederhana </h> <form Action = "submit.action" Method = "Post"> <img src = "jcaptcha.jpg"/> <input type = "Text" name = "japtcha" value = ""/<input type = "kirim"/> </Forms =/Body = ""
Legenda Implementasi:
Metode 4:
Diimplementasikan dengan komponen open source Kaptcha. Juga menggunakan Kaptcha memerlukan pengunduhan paket komponen JAR -nya. Kaptcha adalah alat pembuatan kode verifikasi yang sangat praktis. Dengan itu, Anda dapat menghasilkan kode verifikasi dari berbagai gaya karena dapat dikonfigurasi. Prinsip Kaptcha Works adalah untuk memanggil com.google.code.kaptcha.servlet.kaptchaservlet (dapat dilihat bahwa itu adalah proyek open source dari Google) untuk menghasilkan gambar. Pada saat yang sama, masukkan string kode verifikasi yang dihasilkan ke dalam httpsession.
Gunakan Kaptcha untuk mengkonfigurasinya dengan nyaman:
Verification code font size Verification code font size Verification code font color Verification code content range (number, letter, Chinese characters!) verification code picture size, border, border thickness, border color verification code interference line (you can inherit com.google.code.kaptcha.NoiseProducer to write a custom interference line) Verification code style (fisheye style, 3D, ordinary blur... Of course, you can also inherit com.google.code.kaptcha.gimpyengine custom style)
...
Informasi konfigurasi untuk KAPTCHA juga ditempatkan di Web.xml: Informasi Konfigurasi yang Diinisialisasi dalam tag <InT-Param>.
<servlet> <servlet-name> Kaptcha </servlet-name> <servlet-class> com.google.code.kaptcha.servlet.kaptchaservlet </servlet-class> <inin-param> <creckripe> Batas gambar, nilai hukum: no </description> <param-name> Kaptcha.border </Param Param: Ya, no </description> <param-name> Kaptcha.border </Param Param: Ya, NO </description> <param-name> Kaptcha.border </Param </init-param> <Ilin-param> <creckreckripe> Warna perbatasan, nilai hukum: r, g, b (dan alfa opsional) atau putih, hitam, biru. </description> <param-name> Kaptcha.border.color </param-name> <param-value> hitam </param-value> </it-param> <Ilin-param> <Ilin-param> <creckripe> ketebalan perbatasan, nilai hukum:/description> <param-name> Kaptcha.border.thickness </Param Nilai:/Deskripsi> <param-name> Kaptcha.border.thickness </Param Nilai:/Deskripsi> <param-name> Kaptcha.border.thickness </Param Param </init-param> <InT-param> <Ilin-Param> <creckreckripe> Lebar gambar </cripence> <param-name> Kaptcha.image.width </param-name> <param-value> </param-value> </init-param> <Ilin--param> <crickence> </description> </init-param> <Ilin-param> <crickipence> High High </description> Kaptch.kapch. <param-value> </param-value> </init-param> <Ilin-param> <crickipence> Kelas Implementasi Gambar </creckripe> <param-name> Kaptcha.producer.impl </membel--name> <param--value> <param--paru-Paramle.code.kaptcha.impl.defaultCha </Paramle </paramle.code.kaptcha implementation class</description> <param-name>kaptcha.textproducer.impl</param-name> <param-value> com.google.code.kaptcha.text.impl.DefaultTextCreator </param-value> </init-param> <init-param> <description>Text collection, verification code value is obtained from this collection</description> <param-name> Kaptcha.TextProducer.char.string </param-name> <param-value> </param-value> <!-<param-value> abcdegfynmnpwx </parar--param> </-param- Paramy> <param-value> MOOCH CODEMERM.ETM.MALAM> </Param- PARAM/PARAM- PARAM/PARAM- PARAM/PARAM- PARAM> <cripence> Panjang kode verifikasi </cripence> <param-name> Kaptcha.textProducer.char.length </param-name> <param-value> </param-value> </init-param> <Ilin-param> <mrecpription> font, courier </description> <parar-name> Kaptcha.textprucer. Kurir </param-value> </init-param> <Ilin-param> <mrecription> Ukuran font px. </Description> <param-name> Kaptcha.textproducer.font.size </param-name> <param-value> </param-value> </init-param> <it-param> </deskripsi. </description> <param-name> Kaptcha.TextProducer.font.color </param-name> <param-value> hitam </param-value> </it-param> <Ilin-param> <creckripe> interval teks </description> <param-name> Kaptcha.TextProducer.Charch.space </description> <param-name> Kaptcha.TextProducer.Charch.space </description> <param-name> </init-param> <Ilin-param> <creckripe> kelas implementasi interferensi </cripence> <param-name> Kaptcha.noise.impl </param-name> <param-value> <!-com.google.code.kaptcha.impl.nonoise-> com.google.code.kapta. <Ilin-param> <creckripe> Warna interferensi, nilai hukum: r, g, b atau putih, hitam, biru. </description> <param-name> Kaptcha.noise.color </param-name> <param-value> hitam </param-value> </it-param> <Ilin-param> <crickenripple fisheycom. Shadowcom.google.code.kaptcha.impl.shadowgimpy </cripence> <param-name> Kaptcha.obscurificator.impl </param-name> <param-value> com.goOgle.code.kaptcha.impl. <param-name> Kaptcha.background.Impl </param-name> <param-value> com.google.code.kaptcha.impl.defaultbackground </param-value> </itin-param> <Ilin-param> <cride-n-n-n-n-n-n-name. <param-value>green</param-value> </init-param> <init-param> <description>Background color gradient, end color</description> <param-name>kaptcha.background.clear.to</param-name> <param-value>white</param-value> </init-param> <init-param> <description>Text Renderer</description> <param-name> Kaptcha.word.impl </param-name> <param-value> com.google.code.kaptcha.text.impl.defaultrenderererererererer </param-value> </init-param> <inin-param> <cription> Kunci kunci yang menyimpan kode verifikasi di sesi </Param> <init-param> <Param-Value> KAPTCHA_SESSION_KEY </param-value> </init-param> <Ilin-param> <crencher> Tanggal Kaptcha dihasilkan dimasukkan ke dalam httpsession. Ini adalah nilai kunci untuk item itu di sesi. </description> <param-name> Kaptcha.Session.Date </param-name> <param-value> Kaptcha_Session_date </param-value> </it-param> </servlet> <servlet-Mapping> <servlet-name> Kaptcha </servlet-name> <rerr-pattern> <-layanan> <pertiperper> </servlet--name> <rig-Pattern>
Panggilan Depan: Jalur gambar kode verifikasi dipetakan dengan randomCode.jpg, dan event event click () memanggil fungsi JS. Waktu yang sama dalam fungsi JS menggunakan waktu saat ini untuk membatalkan cache browser untuk menyegarkan gambar kode verifikasi.
<html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-"> <itement> randomCode </iteme> <script type = "text/javascript">. ; } </script> </head> <body> <img src = "randomCode.jpg" ontClick = "changer (this)" style = "kursor: pointer;"> <bentuk action = "check.jsp"> <input type = "Text" name = "r"> <input type = "kirim" value = "s"> </forms
Check.jsp: Dapatkan informasi string dalam gambar kode verifikasi melalui (string) session.getAttribute (com.google.code.kaptcha.constants.kaptcha_session_key);
<html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-"> <Title> periksa </iteme> </getattribute> <% // periksa apakah itu adalah kode verifikasi yang benar k = (string) sesi .getAttribute (com.google.code.kappch.kappch.saps. String str = request.getParameter ("r"); if (k.equals (str)) out.print ("true"); out.print (k + "---" + str); %> </body> </html>Legenda Implementasi:
Kita dapat menemukan bahwa kode verifikasi kita menjadi semakin berwarna, tetapi kita masih pada tahap memverifikasi hanya huruf dan angka bahasa Inggris. Jadi apakah kita masih bisa memainkan beberapa yang kelas atas? Jawabannya adalah ya. Selanjutnya, mari kita lihat bagaimana menerapkan kode verifikasi Cina dan kode verifikasi aritmatika. Semuanya hanya perlu dimodifikasi berdasarkan penggunaan Kaptcha di atas.
Implementasi Kode Verifikasi Cina:
Pertama, kami menemukan file bytecode defaultTextExtCreator.class di bawah paket Kaptcha.jar. Seperti namanya, ini adalah kelas untuk menghasilkan teks dalam kode verifikasi. Kita dapat mengimplementasikan kelas yang diwarisi darinya sendiri, dan menggunakan kelas implementasi kita sendiri untuk membuat teks dalam kode verifikasi Cina melalui konfigurasi. Setelah dekompilasi berikut, kita dapat melihat bahwa itu diimplementasikan dengan cara itu. Fungsi getText () digunakan untuk menghasilkan teks kode verifikasi yang akan dirender oleh konfigurator getConfig (), jadi kita hanya perlu mewarisi kelas konfigurasi dan mengimplementasikan antarmuka pembuatan teks dan menimpa metode getText ().
Public Class DefaultTextCreator meluas yang dapat dikonfigurasi mengimplementasikan TextProducer {public string getText () {int length = getConfig (). getTextProducerCharLength (); char [] chars = getConfig (). getTextProducerCharstring (); int randomContext = chars.length -; Rand acak = acak baru (); Teks StringBuffer = StringBuffer baru (); untuk (int i =; i <length; i ++) {text.append (chars [(rand.nextint (randomContext)+)]); } return text.toString (); }}Berikut ini adalah implementasi spesifik ChineseText.java: Program hanya menjalankan kode di getText (). Kode asli ditulis dalam getText1 () dan tidak menjalankannya. Anda bisa membuat perbandingan.
kelas publik chineseText memperluas yang dapat dikonfigurasi mengimplementasikan TextProducer {public String getText () {int length = getConfig (). GetTextProducerCharLength (); // char [] chars = getConfig (). getTextProducerCharstring (); String [] s = string baru [] {"i", "love", "tab", "trow" dan "," jual "," Screw "," Tombol "}; acak rand = new random (); stringBuffer sb = new stringBuffer (); for (int i = i <length; i ++) {int ind = rand.nextint (s.); SB.ToString (); "", "," a "," b "," c "," d "," e "," f "}; Rand acak = acak baru (); untuk (int i =; i <panjang; i ++) {switch (rand.nextInt (array.length)) {case: tempinT = rand.nextInt ()+; firstword = string.valueof ((char) tempint); merusak; Kasus: int r, r, r, r; String strh, strl; // tinggi & rendah r = rand.nextInt () +; // tutup depan dan buka [,) if (r ==) {r = rand.nextInt (); } else {r = rand.nextInt (); } r = rand.nextInt () +; if (r ==) {r = rand.nextInt () +; } else if (r ==) {r = rand.nextInt (); } else {r = rand.nextInt (); } strh = array [r] + array [r]; strl = array [r] + array [r]; byte [] bytes = byte baru []; bytes [] = (byte) (integer.parseint (strh,)); bytes [] = (byte) (integer.parseint (strl,)); firstword = string baru (bytes); merusak; default: tempint = rand.nextInt () +; firstword = string.valueof ((char) tempint); merusak; } finalword += firstword; } return finalword; }}Langkah terakhir adalah mengubah nilai kelas implementasi teks di web.xml, sehingga komponen memanggil kelas yang ditulisnya untuk menghasilkan kode verifikasi Cina.
<Ilin-Param> <creckripe> Kelas Implementasi Teks </description> <param-name> Kaptcha.TextProducer.Impl </param-name> <param-value> chinesetext </param-value> </itin-param>
Legenda Implementasi:
Implementasi Kode Verifikasi Operasi Aritmatika:
Sama seperti kode verifikasi Cina di atas, kita perlu mengimplementasikan kelas kita sendiri dengan mewarisi kelas dan antarmuka, dan menulis ulang fungsi di dalamnya, dan kemudian mengubah informasi konfigurasi untuk membuat komponen memanggil kelas yang mereka terapkan untuk mencapai diversifikasi formulir kode verifikasi.
Kode file bytecode KaptChaservlet adalah sebagai berikut:
kelas publik KaptChaservlet memperluas httpservlet mengimplementasikan servlet {private properties props = properti baru (); produser pribadi Kaptchaproducer = null; Private String sessionKeyValue = null; public void init (servletconfig conf) melempar servletException {super.init (conf); Imageo.setusecache (false); Enumeration <?> Initparams = conf.getInitparameternames (); while (initparams.hasmoreElements ()) {string key = (string) initparams.nextElement (); Nilai string = conf.getInitparameter (key); this.props.put (kunci, nilai); } Config config = config baru (this.props); this.kaptchaproducer = config.getProducerImpl (); this.SessionKeyValue = config.getSessionKey (); } public void doGet (httpservletRequest req, httpservletResponse resp) melempar servletException, ioException {resp.setDateheader ("kedaluwarsa", l); resp.setHeader ("cache-control", "no-store, no-cache, harus-revalidasi"); resp.addheader ("cache-control", "post-check =, pre-check ="); resp.setheader ("pragma", "no-cache"); resp.setContentType ("gambar/jpeg"); String captext = this.kaptchaproducer.createText (); req.getSession (). setAttribute (this.SessionKeyValue, captext); BufferedImage bi = this.kaptchaproducer.createMage (captext); ServeTeTutputStream out = resp.getoutputStream (); Imageo.write (bi, "jpg", out); coba {out.flush (); } akhirnya {out.close (); }}}Kemudian kode KAPTCHASERVLET.java yang saya terapkan oleh diri saya adalah sebagai berikut: Menambahkan logika ke file bytecode asli untuk mengimplementasikan kode verifikasi tambahan, dan Anda dapat menemukannya melalui perbandingan.
kelas publik KaptChaservlet memperluas httpservlet mengimplementasikan servlet {private properties props; produser pribadi Kaptchaproducer; Private String SessionKeyValue; public KaptChaserVlet () {this.props = properti baru (); this.kaptchaproducer = null; this.SessionKeyValue = null; } public void init (servletconfig conf) melempar servletException {super.init (conf); Imageo.setusecache (false); Enumeration initparams = conf.getInitparameternames (); while (initparams.hasmoreElements ()) {string key = (string) initparams.nextElement (); Nilai string = conf.getInitparameter (key); this.props.put (kunci, nilai); } Config config = config baru (this.props); this.kaptchaproducer = config.getProducerImpl (); this.SessionKeyValue = config.getSessionKey (); } public void doGet (httpservletRequest req, httpservletResponse resp) melempar servletException, ioException {resp.setDateheader ("kedaluwarsa", l); resp.setHeader ("cache-control", "no-store, no-cache, harus-revalidasi"); resp.addheader ("cache-control", "post-check =, pre-check ="); resp.setheader ("pragma", "no-cache"); resp.setContentType ("gambar/jpeg"); String captext = this.kaptchaproducer.createText (); String s = captext.substring (,); String s = captext.substring (,); int r = integer.valueof (s) .IntValue () + integer.valueof (s) .IntValue (); req.getSession (). setAttribute (this.SessionKeyValue, String.ValueOf (r)); BufferedImage bi = this.kaptchaproducer.createImage (s+"+"+s+"=?"); ServeTeTutputStream out = resp.getoutputStream (); Imageo.write (bi, "jpg", out); coba {out.flush (); } akhirnya {out.close (); }}}Kami juga perlu mengubah konfigurasi di awal web.xml untuk membuat komponen memanggil servlet yang Anda terapkan:
<servlet-name> Kaptcha </servlet-name> <servlet-class> Kaptchaservlet </servlet-class>
Legenda Implementasi:
Meringkaskan:
Ini hanyalah implementasi sederhana dari kode verifikasi, tetapi masih jauh dari cukup untuk menggunakannya untuk proyek komersial. Jika kode verifikasi tidak retak, berbagai algoritma enkripsi harus ditambahkan. Meski begitu, Anda dapat mencari kode verifikasi yang retak di mana -mana. Ada database bawah tanah di Internet, yang menyimpan informasi pribadi kami. Informasi ini disortir satu per satu, yang sangat mengerikan. Namun, database seperti itu ada secara objektif. Kode verifikasi, sebagai bagian penting dari melindungi kata sandi akun, menjadi semakin tidak aman. Karena kebocoran informasi pribadi, orang lain dapat melakukan penipuan pada Anda setelah mereka memiliki informasi yang cukup tentang Anda. Di antara mereka, kode verifikasi adalah bagian penting. Baru -baru ini, sebuah insiden di mana seorang lulusan ditipu untuk mendapatkan kode verifikasi dan semua kekayaannya ditransfer dalam beberapa jam. Jadi tolong lindungi kode verifikasi Anda dan jangan dengan mudah mengungkapkannya kepada orang lain.
Tentu saja, kami tidak akan duduk diam dan menunggu kematian. Jenis kode verifikasi saat ini menjadi semakin sulit untuk retak. Seperti pengenalan suara dan pengenalan wajah semuanya akrab, jadi saya tidak akan banyak bicara.
Di sini kami memperkenalkan konsep "baru" kode verifikasi: otentikasi dua faktor.
Otentikasi dua faktor adalah sistem yang menggunakan teknologi sinkronisasi waktu, yang menggunakan kata sandi satu kali yang dihasilkan berdasarkan tiga variabel waktu, peristiwa dan kunci untuk menggantikan kata sandi statis tradisional. Setiap kartu kata sandi dinamis memiliki kunci unik, yang disimpan di sisi server secara bersamaan. Setiap kali kartu kata sandi dinamis dan server menghitung kata sandi dinamis yang diautentikasi berdasarkan kunci yang sama, parameter acak yang sama (waktu, peristiwa) dan algoritma yang sama, sehingga memastikan konsistensi kata sandi dan mewujudkan otentikasi pengguna. Karena parameter acak berbeda selama setiap otentikasi, kata sandi dinamis yang dihasilkan setiap kali juga berbeda. Karena keacakan parameter selama setiap perhitungan memastikan ketidakpastian setiap kata sandi, proses otentikasi kata sandi paling dasar memastikan keamanan sistem. Memecahkan kerugian besar yang disebabkan oleh penipuan kata sandi, mencegah penyusup jahat atau kerusakan buatan, dan menyelesaikan masalah intrusi yang disebabkan oleh kebocoran kata sandi.
Sederhananya, otentikasi identitas dua faktor adalah sistem otentikasi identitas yang hanya dapat bekerja melalui kombinasi dari apa yang Anda ketahui dan dua elemen yang dapat Anda miliki. Misalnya, kartu bank yang menarik uang dari ATM adalah contoh mekanisme otentikasi dua faktor. Anda perlu mengetahui kombinasi kata sandi penarikan dan kartu bank sebelum Anda dapat menggunakannya. Saat ini, sistem otentikasi dua faktor utama didasarkan pada sinkronisasi waktu dan memiliki pangsa pasar yang tinggi. Sistem otentikasi dua faktor DKE , sistem otentikasi dua faktor RSA , dll. Karena DKEY meningkatkan dukungan untuk otentikasi kata sandi SMS dan otentikasi hibrida SMS + token, sistem otentikasi dua faktor DKEY lebih kompetitif daripada RSA.
Di atas adalah konten yang relevan dari produksi kode verifikasi Java yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda!