Ensuite, l'article précédent de la production de code de vérification Java (partie 1) vous présentera des connaissances pertinentes sur le code de vérification Java!
Méthode 3:
Implémenté avec le composant open source JCAPTCHA, combiné à Spring, il peut générer diverses formes de codes de vérification. JCAPTCHA est la version Java du projet CAPTCHA. Il s'agit d'un projet open source qui prend en charge la génération de codes de vérification pour les graphiques et les versions sonores. Lors de la génération de codes de vérification pour les versions sonores, Freetts est requis. Le nom complet de CAPTCHA est un test de Turing public entièrement automatisé pour que les ordinateurs et les humains aient été utilisés pour la première fois comme projet de recherche scientifique à l'Université Carnegie Mellon. Il a été utilisé pour générer un test facile à passer pour les humains mais difficile à passer pour les ordinateurs. Il est actuellement largement utilisé dans les applications réseau et est utilisé pour empêcher les robots de publier des informations sur les spams. Actuellement, le site officiel de JCAPTCHA montre qu'il existe la version 2.0, mais la version binaire n'est que la version 1.0 à télécharger.
Nous devons d'abord préparer le package de pot correspondant
Dans la mise en œuvre du projet JCAPTCHA, il fait également référence à deux projets open source, collections de communs et collection de communs. De plus, la mise en œuvre de JCAPTCHA elle-même, nous avons besoin de trois packages au total, et les informations spécifiques sont les suivantes:
JCAPTCHA-2.0-all.jarcommons-Logging-1.1.1.JarCommons-Collections-3.2.Jar
Deuxièmement, examinons les informations de configuration des clés dans le web.xml ci-dessous: En plus de configurer le chemin de classe spécifique du composant JCAPTCHA, le soldActionServlet est également configuré, qui est utilisé comme servlet pour les codes de vérification de comparaison, et les deux sont cartographiés. Il peut être compris comme modifiant le nom. Lorsque vous appelez le composant ou le servlet dans /jcaptcha.jpg et / submit.action, respectivement, il peut être utilisé directement pour utiliser ce nom de mappage.
<Serplet> <Serplet-Name> jcaptcha </vrlett-name> <servlet-class> com.octo.captcha.module.servlet.image.simpleimagecaptchaservlet </ servlet-Class> </ servlet> <frlet> <servlet-name> soumis </vred-name> <servlet-class> com.octo.captcha.module.servlet.image.sample.submitActionServlet </vrlet-Class> </ Servlet> <Servlet-Mapping> <Servlet-Name> JCAPTCHA </vrlet-name> <url-Pattern> / jcaptcha-Mapt> <Servlet-Name> Soumider </ servlet-name> <url-sattern> /submit.action </url-stern> </ serplet-mapping>
web.xml
Voyons ensuite comment SoumisActionServlet est implémenté: Étant donné que le package de composant JCAPTCHA est importé, la méthode encapsulée SimpleImageCaptChaservlet.ValidateResponse (demande, userCaptCaSonSon) est directement appelée pour déterminer si les informations du code de vérification correspondent à la soumission, sans considérer le processus de mise en œuvre spécifique.
classe publique SoumisActionServlet étend httpServlet {protected void doPost (httpsservletRequest request, httpservletResponse réponse) lance ServletException, ioException {String userCaptCharSonS = request.getParamètre ("japtcha"); booléen captchapassed = SimpleImageCaptChaservlet.validateResponse (demande, userCaptCaSonSon); if (capchapassed) Response.getWriter (). Write ("CaptCha passé"); else {réponse.getWriter (). Write ("CaptCha a échoué"); } réponse.getWriter (). Write ("<br/> <a href = 'index.jsp'> réessayer </a>"); }} SoumisActionServlet Enfin, jetons un coup d'œil à l'appel de la réception simple:
<html> <body> <h> échantillon de servlet CAPTCHA simple </h> <form action = "soumets.action" metheth = "post"> <img src = "jcaptcha.jpg" /> <intrut type = "text" name = "japtcha" value = "" /> <intry type = "soumi" /> </ form> </odody> </html>
Légende de mise en œuvre:
Méthode 4:
Implémenté avec le composant open source Kaptcha. L'utilisation également de Kaptcha nécessite le téléchargement de son package de composants JAR. Kaptcha est un outil de génération de code de vérification très pratique. Avec lui, vous pouvez générer des codes de vérification de divers styles car il est configurable. Le principe de Kaptcha Works est d'appeler com.google.code.kaptcha.servlet.kaptchaservlet (on peut voir qu'il s'agit d'un projet open source de Google) pour générer une image. En même temps, placez la chaîne de code de vérification générée dans HTTPSESSION.
Utilisez Kaptcha pour le configurer commodément:
Code de vérification Taille de la police Code de vérification Taille de police Code de vérification du code de vérification Couleur Couleur de vérification Plage de contenu (numéro, lettre, caractères chinois!) Code de vérification Taille de l'image, bordure, épaisseur de bordure, borde com.google.code.kaptcha.gimpyEngine Custom Style)
...
Les informations de configuration de Kaptcha sont également placées dans web.xml: les informations de configuration initialisées dans la balise <Init-Param>.
<VerTlet> <Serplet-name> kaptcha </vrlett-name> <servlet-class> com.google.code.kaptcha.servlet.kaptchaservlet </ servlet-Class> <Init-Param> <description> Border, Valeur juridique: oui, non </ Description> <Amar-Name> Kaptcha. </nit-param> <Init-Param> <description> Couleur de bordure, valeur juridique: R, G, B (et alpha en option) ou blanc, noir, bleu. </ Description> <Am param-name> kaptcha.border.color </ param-name> <param-Value> Black </ Param-Value> </Init-Param> <Init-Param> <Init-Param> <, description> Épaisseur de bordure, Valeur juridique:> / Description> <AmAram-Name> Kaptcha.border.Thickness </ paramname> </1nit-Param> <Init-Param> <Init-Param> <escription> Width d'image </ Description> <Am param-name> kaptcha.image.width </ param-name> <param-value> <Am param-Value> </ Param-Value> </nici-Param> <Init-Param> <D, description> Classe d'implémentation d'image </, description> <param-name> kaptcha.producer.impl </ param-name> <param-value> com.google.code.kaptcha.impl.defaultkaptcha </ param-value> Classe d'implémentation </ Description> <Am param-name> kaptcha.textproducer.impl </ param-name> <param-valeur> com.google.code.kaptcha.text.impl.defaulttextcreator </ param-value> </ init-patam> <Init-Param> <description> La collecte de texte de la vérification est obtenue à partir de cette collection </ init-pataM> <param-name> kaptcha.textproducer.char.string </onsam-name> <param-valie> </ param-value> <! - <param-vale> abcdegfynmnpwx </ param-value> -> <! - <param-value> mooch.com Exemple de code de vérification </ param-value> -> </ initaM> <escription> Vérification Longueur du code </ Description> <Am param-name> kaptcha.textproducer.char.length </ param-name> <param-valeur> </ param-value> </itit-param> <it-param> <description> Font Arial, courrier </ description> <param-name> kaptcha.textproducer.font.Names </ paramname> <onsonde> arroducer.font.Names </ paramname> <onsonde> arroducer.font.Names </Arvin> <Araire> Arrial, Arroducer.font.Names </Ar paramad> Courier </ Param-Value> </Init-Param> <Init-Param> <Pesitre> Taille de la police Px. </, description> <param-name> kaptcha.textproducer.font.size </ param-name> <param-value> </ param-valent> </ Description> <Am param-name> kaptcha.textproducer.font.color </ param-name> <param-value> noir </ param-value> </nitt-Param> <Init-Param> <escription> Text Interval </DRICH-NAME> <AMAM-VALUE> </1nit-Param> <Init-Param> <Description> Classe d'implémentation d'interférence </, description> <param-name> kaptcha.noise.impl </ param-name> <param-value> <! - com.google.code.kaptcha.impl.nonoise -> com.google.code.kaptcha.impl.DefaultNoise </ Parkin-value> </ initam> <IniT-PARAM> <Description> Couleur d'interférence, valeur juridique: R, G, B ou blanc, noir, bleu. </ Description> <Amam-name> kaptcha.noise.color </onsam-name> <param-value> noir </ param-valeur> </itnit-Param> <Innit-Param> <D, description> Style d'image: Water-Stitch.google.code.kaptcha.impl.waterrippleyegyegyerecy.google.code.kaptcha.impl.fisheegyegyegyegy. Shadowcom.google.code.kaptcha.impl.shadowgimpy </ description> <param-name> kaptcha.obscurrificator.impl </ param-name> <param-value> com.google.code.kaptcha.impl.waterripple </ param-valeurs> </it init-param> <init-param> <Am param-name> kaptcha.background.impl </ param-name> <param-valie> com.google.code.kaptcha.impl.defaultbackground </ param-valent> </itnit-Param> <Init-Param> <Pedéhip> Background Colordient, Start Color </ Description> <paramn-Name> KaptCha.Background.Colar <Am param-Value> vert </onsam-Value> </ init-Param> <Init-Param> <Pedéhip> Gradient de couleur d'arrière-plan, End Color </ Description> <Amam-Name> Kaptcha.background.Clear.to </ Param-Name> <AniT-Value> White </ Param-value> <param-name> kaptcha.word.impl </ param-name> <param-valie> com.google.code.kaptcha.text.impl.defaultwrederer </ param-value> </ init-param> <Init-Param> <Dcription> La clé qui stocke le code de vérification. <Am param-Value> Kaptcha_Session_Key </Ar param-Value> </Init-Param> <Init-Param> <escription> La date à laquelle le kaptcha est généré est placé dans la HttpSession. Il s'agit de la valeur clé de cet élément de la session. </ Description> <Am param-name> kaptcha.session.date </ param-name> <param-valeur> kaptcha_session_date </ param-value> </ init-param> </ servlet> <servlet-mapping> <stand-name> kaptcha </ servlet-name> <url-pattern> /randomcode.jpg </url> <Url-Pattern> / servletmcode.jpg </ url> <url-Pattern> / Servletmcode.jpg
Appel avant: le chemin d'accès de l'image du code de vérification est mappé avec RandomCode.jpg, et l'événement cliquez OnClick () appelle la fonction JS. Le même temps dans la fonction JS utilise l'heure actuelle pour invalider le cache du navigateur pour actualiser l'image du code de vérification.
<html> <éad- head> <meta http-equiv = "contenu-type" contenu = "text / html; charset = utf -"> <ititle> randomcode </ title> <script type = "text / javascript"> Changereur de fonction (node) {// utilisé pour générer différents codes de vérification lors du clic node.src = "randomcode.jpg? Date (). GetTime (); } </ script> </ head> <body> <img src = "randomcode.jpg" onclick = "changer (this)" style = "cursor: pointer;"> <form action = "check.jsp"> <input "Check.jsp: Obtenez les informations de chaîne dans l'image du code de vérification via (String) session.getAttribute (com.google.code.kaptcha.constants.kaptcha_session_key);
<html> <éadfride> <méta http-equiv = "contenu-type" contenu = "text / html; charset = utf -"> <ititle> cocher </title> </ head> <% /% // vérifier si c'est le code de vérification correct k = (string). String str = request.getParameter ("r"); if (k.equals (str)) out.print ("true"); out.print (k + "---" + str); %> </ body> </html>Légende de mise en œuvre:
Nous pouvons constater que nos codes de vérification deviennent de plus en plus colorés, mais nous sommes toujours au stade de la vérification des lettres et des chiffres anglais. Alors, pouvons-nous encore jouer des haut-parleurs haut de gamme? La réponse est oui. Ensuite, examinons comment implémenter les codes de vérification chinois et les codes de vérification arithmétique. Tous doivent seulement être modifiés en fonction de l'utilisation ci-dessus de Kaptcha.
Implémentation du code de vérification chinois:
Nous trouvons d'abord un fichier bytecode defaultTextCreator.class sous le package kaptcha.jar. Comme son nom l'indique, il s'agit d'une classe pour générer du texte dans le code de vérification. Nous pouvons implémenter une classe dont nous avons hérité par nous-mêmes et utiliser notre propre classe d'implémentation pour faire du texte dans le code de vérification chinois via la configuration. Après la décompilation suivante, nous pouvons voir qu'elle est mise en œuvre de cette manière. La fonction getText () est utilisée pour générer le texte du code de vérification que le configurateur getConfig () rendra, nous devons donc hériter de la classe de configuration et implémenter l'interface de génération de texte et écraser la méthode getText ().
La classe publique defaultTextCreat étend Configurable Implélements TextProducer {public String getText () {int length = getConfig (). getTextProducerCharlNength (); char [] chars = getConfig (). getTextProducerCharstring (); int randomnContext = chars.length -; Random Rand = new Random (); StringBuffer Text = new StringBuffer (); for (int i =; i <length; i ++) {text.append (chars [(rand.nextint (randomContext) +)]); } return text.toString (); }}Ce qui suit est l'implémentation spécifique de chinesext.java: le programme exécute uniquement le code dans getText (). Le code d'origine est écrit dans getText1 () et ne l'exécute pas. Vous pouvez faire une comparaison.
classe publique ChineSeText étend les outils configurables textProducer {public String getText () {int length = getConfig (). getTextProducerCharlNength (); // char [] chars = getConfig (). getTextProducerCharstring (); String [] s = new String [] {"i", "love", "tab", "trow" et "," sell "," vis "," bouton "}; random rand = new random (); stringbuffer sb = new StringBuffer (); for (int i =; i <longueur; i ++) {int ind = rand.nextint (s.Length); sb.Append (s [ind]);} SB.TOSTRING ();} / ** * INSTERNEMENTS * @reTurn * / public String GetText () {int Length = GetConfig (). "," a "," b "," c "," d "," e "," f "}; Random Rand = new Random (); for (int i =; i <length; i ++) {switch (rand.nextint (array.length)) {case: tempint = rand.nextint () +; Firstword = String.Valueof ((char) tempint); casser; Cas: Int R, R, R, R; String strh, strl; // high & low r = rand.nextint () +; // Fermer et ouvert [,) 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]; octet [] octets = nouveau octet []; Bytes [] = (byte) (Integer.ParseInt (strh,)); Bytes [] = (byte) (Integer.ParseInt (strl,)); Firstword = new String (octets); casser; par défaut: tempint = rand.nextint () +; Firstword = String.Valueof ((char) tempint); casser; } MOTS FINAL + = Firstword; } retour des mots finaux; }}La dernière étape consiste à modifier la valeur de la classe d'implémentation de texte dans web.xml, afin que le composant appelle la classe qu'il écrit pour générer du code de vérification chinois.
<IniT-PARAM> <Description> Classe d'implémentation de texte </ Description> <Am param-name> kaptcha.textproducer.impl </onsam-name> <param-vale> chinesext </ param-valeur> </itnit-param>
Légende de mise en œuvre:
Implémentation du code de vérification de l'opération arithmétique:
Comme le code de vérification chinois ci-dessus, nous devons implémenter notre propre classe en héritant des classes et des interfaces, et réécrire les fonctions en elle, puis modifier les informations de configuration pour faire en sorte que les composants appellent les classes qu'ils implémentent pour réaliser la diversification du formulaire de code de vérification.
Le code du fichier bytecode kaptchaservlet est le suivant:
La classe publique KaptChaservlet étend HttpServlet implémente servlet {Private Properties props = new Properties (); le producteur privé KaptChaproducer = null; String privé SessionKeyValue = null; public void init (ServletConfig conf) lève ServletException {super.init (conf); ImageIo.SetUseCache (false); Enumeration <?> InitParams = conf.getInitParameTames (); while (initparams.hasmoreElements ()) {string key = (string) initparams.nextelement (); String Value = conf.getInitParAmètre (clé); this.props.put (clé, valeur); } Config config = new config (this.props); this.kaptChaproducer = config.getProduceImpl (); this.sessionKeyValue = config.getSessionKey (); } public void doGet (httpservletRequest req, httpservletResponse resp) lève ServletException, ioException {resp.setDateHeader ("expire", l); resp.sethEader ("Cache-Control", "sans magasin, sans cache, doit-revalider"); resp.Addheader ("cache-control", "post-check =, pré-Check ="); resp.sethEader ("pragma", "non-cache"); resp.setContentType ("image / jpeg"); String captext = this.kaptchaproducer.createText (); req.getSession (). SetAttribute (this.sessionykevalue, captext); BufferedImage Bi = this.kaptChaproducer.CreateImage (CapText); ServletOutputStream out = resp.getOutputStream (); ImageIo.write (BI, "JPG", out); essayez {out.flush (); } enfin {out.close (); }}}Ensuite, le code kaptchaservlet.java que j'ai implémenté par moi-même est le suivant: Ajout de la logique au fichier bytecode d'origine pour implémenter le code de vérification d'addition, et vous pouvez le découvrir par comparaison.
La classe publique KaptChaservlet étend HttpServlet implémente Servlet {Private Properties Props; le producteur privé Kaptchaproducer; String privé SessionKeyValue; public kaptchaservlet () {this.props = new Properties (); this.kaptchaproducer = null; this.SessionKeyValue = null; } public void init (ServletConfig conf) lève ServletException {super.init (conf); ImageIo.SetUseCache (false); Énumération initparams = conf.getInitParameTernames (); while (initparams.hasmoreElements ()) {string key = (string) initparams.nextelement (); String Value = conf.getInitParAmètre (clé); this.props.put (clé, valeur); } Config config = new config (this.props); this.kaptChaproducer = config.getProduceImpl (); this.sessionKeyValue = config.getSessionKey (); } public void doGet (httpservletRequest req, httpservletResponse resp) lève ServletException, ioException {resp.setDateHeader ("expire", l); resp.sethEader ("Cache-Control", "sans magasin, sans cache, doit-revalider"); resp.Addheader ("cache-control", "post-check =, pré-Check ="); resp.sethEader ("pragma", "non-cache"); resp.setContentType ("image / 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.sessionykevalue, string.valueof (r)); BufferedImage bi = this.kaptchaproducer.createImage (s + "+" + s + "=?"); ServletOutputStream out = resp.getOutputStream (); ImageIo.write (BI, "JPG", out); essayez {out.flush (); } enfin {out.close (); }}}Nous devons également modifier la configuration au début de web.xml pour que le composant appelle le servlet que vous avez implémenté:
<Servlet-Name> kaptcha </vrlet-name> <servlet-class> kaptchaservlet </ serplet-class>
Légende de mise en œuvre:
Résumer:
Ce n'est qu'une simple implémentation du code de vérification, mais il est encore loin d'être suffisant pour l'utiliser pour des projets commerciaux. Si le code de vérification n'est pas craqué, divers algorithmes de chiffrement doivent être ajoutés. Même ainsi, vous pouvez rechercher le code de vérification fissuré partout. Il existe une base de données souterraine sur Internet, qui stocke nos informations personnelles. Les informations sont réglées une par une, ce qui est très terrible. Cependant, une telle base de données existe objectivement. Les codes de vérification, en tant que partie importante de la protection des mots de passe du compte, sont devenus de plus en plus dangereux. En raison de la fuite d'informations personnelles, d'autres peuvent vous engager une fraude après avoir suffisamment d'informations sur vous. Parmi eux, les codes de vérification sont une partie importante. Récemment, un incident dans lequel un diplômé a été trompé pour obtenir des codes de vérification et toute sa richesse a été transférée en quelques heures. Veuillez donc protéger votre code de vérification et ne pas le divulguer facilement à d'autres.
Bien sûr, nous ne resterons pas immobiles et n'attendrons pas la mort. Les types actuels de codes de vérification deviennent de plus en plus difficiles à casser. Comme la reconnaissance vocale et la reconnaissance faciale sont tous familiers, donc je ne dirai pas grand-chose.
Ici, nous introduisons un "nouveau" concept de code de vérification: l'authentification à deux facteurs.
L'authentification à deux facteurs est un système qui utilise la technologie de synchronisation du temps, qui utilise un mot de passe unique généré en fonction des trois variables du temps, de l'événement et de la clé pour remplacer le mot de passe statique traditionnel. Chaque carte de mot de passe dynamique a une clé unique, qui est stockée du côté serveur en même temps. Chaque fois que la carte de mot de passe dynamique et le serveur calculent le mot de passe dynamique authentifié basé sur la même clé, les mêmes paramètres aléatoires (temps, événement) et le même algorithme, garantissant ainsi la cohérence du mot de passe et réalisant l'authentification des utilisateurs. Parce que les paramètres aléatoires sont différents pendant chaque authentification, le mot de passe dynamique généré à chaque fois est également différent. Étant donné que l'aléatoire des paramètres pendant chaque calcul garantit l'imprévisibilité de chaque mot de passe, le processus d'authentification de mot de passe le plus basique assure la sécurité du système. Résoudre les pertes majeures causées par la fraude par mot de passe, empêcher les intrus malveillants ou les dommages artificiels et résoudre le problème d'intrusion causé par la fuite de mot de passe.
En termes simples, l'authentification à deux facteurs est un système d'authentification d'identité qui ne peut fonctionner que par la combinaison de ce que vous savez et des deux éléments que vous pouvez avoir. Par exemple, une carte bancaire retirant de l'argent d'un guichet automatique est un exemple de mécanisme d'authentification à deux facteurs. Vous devez connaître la combinaison du mot de passe de retrait et de la carte bancaire avant de pouvoir l'utiliser. Actuellement, le système d'authentification à deux facteurs grand public est basé sur la synchronisation du temps et a une part de marché élevée. Le système d'authentification à deux facteurs DKEY , le système d'authentification à deux facteurs RSA , etc. Étant donné que DKEY augmente la prise en charge de l'authentification du mot de passe SMS et de l'authentification hybride de jeton SMS +, le système d'authentification DKEY à deux facteurs est plus compétitif que RSA.
Ce qui précède est le contenu pertinent de la production de code de vérification Java qui vous est présenté par l'éditeur. J'espère que cela vous sera utile!