Als nächstes werden Sie mit dem vorherigen Artikel der Java -Verifizierungscodeproduktion (Teil 1) relevante Kenntnisse über den Java -Verifizierungscode vorgestellt!
Methode 3:
Implementiert mit der Open -Source -Komponente JCaptcha, kombiniert mit Feder, kann es verschiedene Formen von Verifizierungscodes erzeugen. Jcaptcha ist die Java -Version des Captcha -Projekts. Es ist ein Open -Source -Projekt, das die Erzeugung von Verifizierungscodes für Grafik und Klangversionen unterstützt. Beim Generieren von Verifizierungscodes für Soundversionen ist FRETTS erforderlich. Der vollständige Name von Captcha vollständig automatisierter öffentlicher Turing -Test, um Computer und Menschen auseinander zu sagen, wurde erstmals als wissenschaftliches Forschungsprojekt an der Carnegie Mellon University verwendet. Es wurde verwendet, um einen Test zu erzeugen, der für Menschen einfach zu bestehen ist, aber es ist schwierig, dass Computer bestehen. Es wird derzeit in Netzwerkanwendungen häufig verwendet und wird verwendet, um Roboter daran zu hindern, Spam -Informationen zu veröffentlichen. Derzeit zeigt die offizielle JCaptcha -Website, dass es Version 2.0 gibt, aber die binäre Version ist nur Version 1.0 zum Download.
Zuerst müssen wir das entsprechende JAR -Paket vorbereiten
Bei der Implementierung des JCaptcha-Projekts verweist es auch zwei Open-Source-Projekte, Commons-Collections und Commons-Logging. Darüber hinaus benötigen die Implementierung von JCaptcha selbst insgesamt drei Pakete, und die spezifischen Informationen sind wie folgt:
jcaptcha-2.0-all.jarcommons-logging-1.1.1.jarcommons-collections-3.2.jar
Sehen wir uns zweitens die wichtigsten Konfigurationsinformationen in web.xml an. Es kann als Änderung des Namens verstanden werden. Wenn Sie die Komponente oder das Servlet in /jcaptcha.jpg bzw. /submit.action aufrufen, kann sie direkt verwendet werden, um diesen Zuordnungsnamen zu verwenden.
<servlet> <servlet-name> jcaptcha </servlet-name> <servlet-classe> com.octo.captcha.module.servlet.image.simleiMageCaptchaServlet </Servlet-Class> </Servlet> <servlet> <Servlet-Name> Senden </servlet-name> <servlet-class>com.octo.captcha.module.servlet.image.sample.SubmitActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>jcaptcha</servlet-name> <url-pattern>/jcaptcha.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <Servlet-name> subieren </servlet-name> <URL-Muster> /Submit.Action </url-pattern> </Servlet-Mapping>
web.xml
Sehen wir uns dann an, wie die Einsendungen implementiert wird: Da das JCaptcha -Komponentenpaket importiert wird, ist die eingekapselte Methode SimpulImageCaptchaServlet.ValidaterePonse (Request, UserCaptCharePonse) direkt aufgerufen, um festzustellen, ob die Informationen im Verifizierungscode mit der Einreichung übereinstimmen, ohne den spezifischen Implementierungsprozess zu berücksichtigen.
Die public class subictactionServlet erweitert HttpServlet {Protected void Dopost (httpServletRequest -Anforderung, HttpServletResponse -Antwort), die ServletException, IOException {String UserCaptarePonse = Anrequa.GetParameter ("Japtcha"); boolean captChapasd = SimpleImageCaptChaServlet.ValidaterePonse (Anfrage, UserCaptarePonse); if (captChapasd) response.getWriter (). Schreiben ("captcha bestanden"); sonst {response.getWriter (). Write ("captcha fehlgeschlagen"); } response.getWriter (). Write ("<br/> <a href = 'index.jsp'> erneut versuchen </a>"); }} SubictactionServlet Schauen wir uns zum Schluss den einfachen Anruf an der Rezeption an:
<html> <body> <h> Einfache Captcha -Servlet -Beispiel </h> <Form Action = "subieren.Action" method = "post"> <img src = "jcaptcha.jpg"/> <Eingabe type = "text" name = "japtcha" value = "/> <input type
Implementierungslegende:
Methode 4:
Implementiert mit der Open Source -Komponente Kaptcha. Auch die Verwendung von Kaptcha erfordert das Herunterladen seines JAR -Komponentenpakets. Kaptcha ist ein sehr praktisches Tool zur Erzeugung von Überprüfungscode. Dabei können Sie Verifizierungscodes verschiedener Stile erstellen, da es konfigurierbar ist. Das Prinzip von Kaptcha -Werken besteht darin, com.google.code.kaptcha.servlet.kaptchaservlet (es ist zu erkennen, dass es sich um ein Open -Source -Projekt von Google handelt) zur Generierung eines Bildes an. Stecken Sie gleichzeitig die generierte Verifizierungscode -Zeichenfolge in httpSession ein.
Verwenden Sie Kaptcha, um es bequem zu konfigurieren:
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)
...
Die Konfigurationsinformationen für Kaptcha sind ebenfalls in web.xml platziert: Die initialisierten Konfigurationsinformationen im Tag <init-param>.
<servlet> <Servlet-name> Kaptcha </Servlet-name> <Servlet-Class> com.google.code.kaptcha.servlet.kaptchaServlet </Servlet-Class> <init-param> <BEKRES es> Bildgrenze, Rechtswert: Ja, nein </Beschreibung> <Param-name> Kapta-Vaptcha> </param-value> </param-vaptcha> </param- </init-param> <init-param> <BEKRES es> Grenzfarbe, rechtlicher Wert: R, G, B (und optionales Alpha) oder weiß, schwarz, blau. </Beschreibung> <param-name> waptcha.border.color </param-name> <param-value> schwarz </param-value> </init-param> <init-param> <init-param> <beschreibung> Grenzdicke, Rechtswert:>/Beschreibung </init-param> <init-param> <init-param> <description>Image width</description> <param-name>kaptcha.image.width</param-name> <param-value></param-value> </init-param> <init-param> <description>Image high</description> <param-name>kaptcha.image.height</param-name> <param-value> </param-value> </init-param> <init-param> <beschreibung> Bild-Implementierungsklasse </Beschreibung> <param-name> kaptcha.producer.impl </param-name> <param-value> com.google.code.kaptcha.impl.defaultkaptChaptcha-Value> </param-value> </initcha> </param-value Implementierungsklasse </Beschreibung> <param-name> waptcha.textproducer.impl </param-name> <param-value> com.google.code.kaptcha.Text.impl.DefaultTextTextRextor </param-value> </init-param> <init-param> <Beschreibung> Text-Sammlung, Verfifizierungscode, der von dieser Sammlung erhalten wird. <Param-name> kaptcha.textProducer.char.String </param-name> <param-value> </param-value> <!-<param-value> abcdegfynmnpwx </param-value>-> <!-<PARAM-VALUE> MOOCH.CAR-INitorial-INitorial-INitoriums-Codebeispiele </param- value </param-Value </param-Value </param-Value </param-Value </param-Value </param-Value </param-Value </param-Value </param-Value </param-Value </param-Value </param-value </param-value </param-value </param-value </param-vala-value </param-vale-codes codebeispiel <BEBRESSUNG> Verifizierungscode-Länge </Beschreibung> <Param-name> KAPTCHA.TEXTPRODER.CHAR.LANGEN </Param-name> <param-value> </param-value> </init-param> <init-param> <Bestrape> font arial, Courier </Beschreibung> <Param-name> kaptcha.textproducer Courier </param-value> </init-param> <init-param> <beschreibung> Schriftgröße px. </Beschreibung> <param-name> waptcha.textproducer.font.color </param-name> <param-value> schwarz </param-value> </init-param> <init-param> <beschreibung> Textintervall </Beschreibung </init-param> <init-param> <beschreibung> Interferenz-Implementierungsklasse </Beschreibung> <param-name> kaptcha.noise.impl </param-name> <param-value> <!-com.google.code.kaptcha.impl.nonoise-com.google. <init-param> <Bestreciness> Interferenzfarbe, Rechtswert: R, G, B oder Weiß, Schwarz, Blau. </Beschreibung> <Param-name> Kaptcha.noise.color </param-name> <param-value> schwarz </param-value> </init-param> <init-param> <beschreibung> Bildstil: Wasserstitch com.google.code.kaptcha.impl.waterRipple Fisheycom.google.code.code.code.code.code.code.code.code.code.code.cape.Cape.Captcha.impl.imlple.imlple. Shadowcom.google.code.kaptcha.impl.ShadowGimpy </description> <param-name>kaptcha.obscurificator.impl</param-name> <param-value> com.google.code.kaptcha.impl.WaterRipple </param-value> </init-param> <init-param> <description>Background implementation class</description> <Param-name> waptcha.background.impl </param-name> <param-value> com.google.code.kaptcha.impl.Defaultbackground </param-value> </init-param> <init-param <param-value> grün </param-value> </init-param> <init-param> <beschreibung> Hintergrund-Farbgradient, Endfarbe </Beschreibung> <Param-name> Kaptcha.background.clear.to </param-name> <param-value> White </param-value> </init-param> <init-param> <Beschreibung <param-name>kaptcha.word.impl</param-name> <param-value>com.google.code.kaptcha.text.impl.DefaultWordRenderer </param-value> </init-param> <init-param> <description> The key key that stores verification code in the session</description> <param-name>kaptcha.session.key</param-name> <PARAM-VALUE> KAPTCHA_SESSION_KEY </param-value> </init-param> <init-param> <beschreibung> Das Datum, an dem die Kaptscha generiert wird, wird in die HTTPSession eingereicht. Dies ist der Schlüsselwert für diesen Element in der Sitzung. </description> <param-name>kaptcha.session.date</param-name> <param-value>KAPTCHA_SESSION_DATE</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Kaptcha</servlet-name> <url-pattern>/randomcode.jpg</url-pattern> </Servlet-Mapping>
Frontanruf: Der Pfad des Verifizierungscodebildes wird mit randomCode.jpg abgebildet, und das Click Event Onclick () ruft die JS -Funktion auf. Gleichzeitig verwendet in der JS -Funktion die aktuelle Zeit, um den Browser -Cache zu ungültig zu machen, um das Verifizierungscode -Bild zu aktualisieren.
<html> <head> <meta http-äquiv = "content-type" content = "text/html; charSet = utf-"> <title> randomCode </title> <script type = "text/javascript"> Funktion Changer (node) {// verwendet, um unterschiedliche Verifizierungscodes zu generieren, wenn klicken. Date (). GetTime (); } </script> </head> <body> <img src = "randomCode.jpg" onclick = "Changer (this)" style = "cursor: pointer;"> <form action = "check.jsp"> <input type = "text" name = "Check.jsp: Rufen Sie die String -Informationen im Bild des Bestätigungscode -Bildes über (String) session.getAttribute (com.google.code.kaptcha.constants.kaptcha_Session_key) ab;
<html> <head> <meta http-äquiv = "content-type" content = "text/html; charSet = utf-"> <title> prüfen </title> </head> <body> <% // prüfen, ob es sich um die korrekte Verifizierungscode-String k = (String) Sitzung .getatTribute (com.google.Caper.Caper.Code ).Caper.Code. String str = request.getParameter ("r"); if (k.equals (str)) out.print ("wahr"); out.print (k + "---" + str); %> </body> </html>Implementierungslegende:
Wir können feststellen, dass unsere Verifizierungscodes immer farbener werden, aber wir befinden uns immer noch in der Phase, in der nur englische Buchstaben und Zahlen überprüft werden. Können wir also noch ein paar High-End-Spiele spielen? Die Antwort lautet ja. Schauen wir uns als nächstes an, wie chinesische Verifizierungscodes und arithmetische Überprüfungscodes implementiert werden können. Alle müssen nur basierend auf der obigen Verwendung von Kaptcha geändert werden.
Implementierung des chinesischen Verifizierungscode:
Zuerst finden wir eine defaultTextCreator.class -Bytecode -Datei unter dem Paket von Kaptcha.jar. Wie der Name schon sagt, handelt es sich um eine Klasse, um Text im Verifizierungscode zu generieren. Wir können eine von uns selbst geerbte Klasse implementieren und unsere eigene Implementierungsklasse verwenden, um den Text im Verifizierungscode Chinese durch Konfiguration zu erstellen. Nach der folgenden Dekompilierung können wir sehen, dass es auf diese Weise implementiert wird. Die Funktion getText () wird verwendet, um den Bestätigungscode -Text zu generieren, den der Konfigurator getConfig () rendert. Daher müssen wir nur die Konfigurationsklasse erben und die Schnittstelle zur Textgenerierung implementieren und die Methode getText () überschreiben.
public class defaultTextCreator erweitert konfigurierbare Geräte implementiert textProducer {public String getText () {int length = getConfig (). getTextProducerCharLength (); char [] chars = getConfig (). getTextProducercharstring (); int randomcontext = chars.length -; Random rand = new random (); StringBuffer text = new StringBuffer (); für (int i =; i <länge; i ++) {text.Append (chars [(rand.nextint (randomcontext))]); } return text.toString (); }}Das Folgende ist die spezifische Implementierung von Chinesetext.java: Das Programm führt nur den Code in GetText () aus. Der Originalcode ist in GetText1 () geschrieben und führt ihn nicht aus. Sie können einen Vergleich machen.
Public Class ChinesETEXT erweitert konfigurierbare Geräte implementiert textProducer {public String getText () {int länge = getConfig (). getTextProducerCharLength (); // char [] chars = getConfig (). getTextProducercharstring (); String [] s = new String [] {"I", "Liebe", "Tab", "Trow" und "," Sell "," Screw "," Button "}; Random Rand = new random (); StringBuffer sb = new StringBuffer (); for (int i =; sb.toString (); "", "," A "," B "," C "," D "," E "," F "}; Random rand = new random (); für (int i =; i <länge; i ++) {switch (rand.nextint (array.length)) {case: tempint = rand.nextint ()+; FirstWord = String.ValueOf ((char) tempint); brechen; Fall: int r, r, r, r; String strh, strl; // hoch & niedrig r = rand.nextint () +; // Front schließen und [,) 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 = new Byte []; Bytes [] = (Byte) (Integer.ParseInt (strh,)); Bytes [] = (Byte) (Integer.ParseInt (strl,)); FirstWord = New String (Bytes); brechen; Standard: tempint = rand.nextint () +; FirstWord = String.ValueOf ((char) tempint); brechen; } endgültiges Wort += Erstwort; } Return Finalwort; }}Der letzte Schritt besteht darin, den Wert der Textimplementierungsklasse in Web.xml zu ändern, damit die Komponente die Klasse aufruft, die sie zum Generieren chinesischer Verifizierungscode erstellt.
<init-param> <beschreibung> Text-Implementierungsklasse </Beschreibung> <Param-name> Kaptcha.textProducer.impl </param-name> <param-value> chinesetext </param-value> </init-param>
Implementierungslegende:
Implementierung des arithmetischen Betriebsüberprüfungscode:
Das gleiche wie der obige chinesische Verifizierungscode, müssen wir unsere eigene Klasse durch Erben von Klassen und Schnittstellen implementieren und die darin enthaltenen Funktionen umschreiben und dann die Konfigurationsinformationen ändern, damit die Komponenten die Klassen aufrufen, die sie implementieren, um die Diversifizierung des Verifizierungscodeformulars zu erreichen.
Der Code der Kaptchaservlet -Bytecode -Datei lautet wie folgt:
öffentliche Klasse Kaptchaservlet erweitert HttpServlet implementiert Servlet {private Eigenschaften props = neue Eigenschaften (); Privatproduzent Kaptchaproducer = NULL; private String SessionKeyValue = null; public void init (servletConfig conf) löst ServletException {Super.init (conf) aus; Imageio.SetUsecache (false); Enumeration <?> Initparams = conf.getInitParameternames (); while (initparams.hasmoreElements ()) {String key = (string) initparams.NextElement (); String value = conf.getInitParameter (Schlüssel); this.props.put (Schlüssel, Wert); } Config = new config (this.Props); this.kaptchaproDrocer = config.getProcerImpl (); this.SessionKeyValue = config.GetSessionKey (); } public void dodget (httpServletRequest req, httpServletResponse resp) löst ServletException aus, ioException {resp.setdatheader ("abläuft", l); resp.setheader ("cache-control", "no-store, no cache, must-revalidat"); resp.addHeader ("cache-control", "post-Check =, pre-Check ="); resp.setheader ("pragma", "no-cache"); resp.setContentType ("Bild/jpeg"); String capText = this.kaptchaproDucer.CreateText (); req.getSession (). setAttribute (this.SessionKeyValue, Captext); Bufferedimage bi = this.kaptchaproDucer.createimage (Captext); ServLetOutputStream out = resp.getOutputStream (); Imageio.write (bi, "jpg", out); probieren {out.flush (); } endlich {out.close (); }}}Dann ist der von mir selbst implementierte Code von Kaptchaservlet.java wie folgt: Die ursprüngliche Bytecode -Datei wurde Logik hinzugefügt, um den Additionsprüfungscode zu implementieren, und Sie können ihn durch Vergleiche ermitteln.
öffentliche Klasse Kaptchaservlet erweitert HttpServlet implementiert Servlet {private Eigenschaften -Requisiten; Privatproduzent Kaptchaproducer; private String SessionKeyValue; public captchaservlet () {this.props = new Properties (); this.kaptchaproducer = null; this.SessionKeyValue = null; } public void init (servletConfig conf) löscht servletException {Super.init (conf); Imageio.SetUsecache (false); Enumeration initparams = conf.getInitParameternames (); while (initparams.hasmoreElements ()) {String key = (string) initparams.NextElement (); String value = conf.getInitParameter (Schlüssel); this.props.put (Schlüssel, Wert); } Config = new config (this.Props); this.kaptchaproDrocer = config.getProcerImpl (); this.SessionKeyValue = config.GetSessionKey (); } public void dodget (httpServletRequest req, httpServletResponse resp) löst ServletException aus, ioException {resp.setdatheader ("abläuft", l); resp.setheader ("cache-control", "no-store, no cache, must-revalidat"); resp.addHeader ("cache-control", "post-Check =, pre-Check ="); resp.setheader ("pragma", "no-cache"); resp.setContentType ("Bild/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+"=?"); ServLetOutputStream out = resp.getOutputStream (); Imageio.write (bi, "jpg", out); probieren {out.flush (); } endlich {out.close (); }}}Wir müssen auch die Konfiguration zu Beginn von web.xml ändern, um den von Ihnen implementierten Servlet aufzurufen:
<servlet-name> kaptcha </servlet-name> <servlet-classe> KaptchaServlet </Servlet-Klasse>
Implementierungslegende:
Zusammenfassen:
Dies ist nur eine einfache Implementierung des Verifizierungscode, aber es ist noch weit ausreichend, ihn für kommerzielle Projekte zu verwenden. Wenn der Verifizierungscode nicht geknackt ist, müssen verschiedene Verschlüsselungsalgorithmen hinzugefügt werden. Trotzdem können Sie überall nach dem geknackten Verifizierungscode suchen. Es gibt eine unterirdische Datenbank im Internet, in der unsere persönlichen Daten gespeichert werden. Die Informationen werden einzeln aussortiert, was sehr schrecklich ist. Eine solche Datenbank existiert jedoch objektiv. Überprüfungscodes als wichtiger Bestandteil des Schutzkennwörters sind zunehmend unsicher. Aufgrund der Ausführung persönlicher Informationen können andere Betrugsbetrug an Sie begehen, nachdem sie genügend Informationen über Sie haben. Unter ihnen sind Verifizierungscodes ein wichtiger Teil. Vor kurzem wurde ein Absolvent getäuscht, um Überprüfungscodes zu erhalten, und sein gesamtes Vermögen wurde innerhalb weniger Stunden übertragen. Schützen Sie also Ihren Verifizierungscode und geben Sie ihn nicht leicht an andere weiter.
Natürlich werden wir nicht still sitzen und auf den Tod warten. Die aktuellen Arten von Überprüfungscodes werden immer schwieriger zu knacken. Wie Spracherkennung und Gesichtserkennung sind alle bekannt, daher werde ich nicht viel sagen.
Hier stellen wir ein "neues" Konzept des Verifizierungscode vor: Zwei-Faktor-Authentifizierung.
Die Zwei-Faktor-Authentifizierung ist ein System, das die Zeitsynchronisationstechnologie verwendet, die ein einmaliges Kennwort verwendet, das basierend auf den drei Variablen Zeit, Ereignis und Schlüssel zum Ersetzen des herkömmlichen statischen Kennworts ersetzt wird. Jede dynamische Passwortkarte verfügt über einen eindeutigen Schlüssel, der gleichzeitig auf der Serverseite gespeichert ist. Jedes Mal, wenn die dynamische Kennwortkarte und der Server das authentifizierte dynamische Kennwort basierend auf demselben Schlüssel, denselben zufälligen Parametern (Zeit, Ereignis) und demselben Algorithmus berechnen, stellt dies die Konsistenz des Kennworts und die Realisierung der Benutzerauthentifizierung sicher. Da die zufälligen Parameter während jeder Authentifizierung unterschiedlich sind, ist das jedes Mal generierte dynamische Kennwort ebenfalls unterschiedlich. Da die Zufälligkeit der Parameter während jeder Berechnung die Unvorhersehbarkeit jedes Kennworts sicherstellt, stellt der grundlegendste Kennwortauthentifizierungsprozess die Sicherheit des Systems sicher. Lösen Sie wichtige Verluste, die durch Kennwortbetrug verursacht werden, verhindern böswillige Eindringlinge oder künstliche Schäden und lösen Sie das durch Passwortverlauf verursachte Intrusionsproblem.
Einfach ausgedrückt, die Zwei-Faktor-Identitätsauthentifizierung ist ein Identitätsauthentifizierungssystem, das nur die Kombination aus dem, was Sie kennen, und den beiden Elementen, die Sie haben können. Beispielsweise ist eine Bankkarte, die Geld von einem Geldautomaten abhebt, ein Beispiel für einen Zwei-Faktor-Authentifizierungsmechanismus. Sie müssen die Kombination aus dem Abhebungskennwort und der Bankkarte kennen, bevor Sie es verwenden können. Derzeit basiert das Mainstream-Zwei-Faktor-Authentifizierungssystem auf der Zeitsynchronisation und hat einen hohen Marktanteil. Das DKEY-Zwei-Faktor-Authentifizierungssystem , das RSA-Zwei-Faktor-Authentifizierungssystem usw. Da DKY die Unterstützung für die SMS-Kennwortauthentifizierung und die SMS + Token Hybrid-Authentifizierung erhöht, ist das DKEY-Zwei-Faktor-Authentifizierungssystem wettbewerbsfähiger als RSA.
Das obige ist der relevante Inhalt der vom Herausgeber vorgelegten Java -Verifizierungscode -Produktion. Ich hoffe, es wird für Sie hilfreich sein!