بعد ذلك ، ستعرضك المقالة السابقة لإنتاج كود التحقق من Java (الجزء 1) إلى المعرفة ذات الصلة حول رمز التحقق من Java!
الطريقة 3:
تم تنفيذه باستخدام مكون المصدر المفتوح JCAPTCHA ، جنبًا إلى جنب مع الربيع ، يمكنه إنشاء أشكال مختلفة من رموز التحقق. Jcaptcha هو إصدار Java من مشروع Captcha. إنه مشروع مفتوح المصدر يدعم توليد رموز التحقق للرسومات وإصدارات الصوت. عند إنشاء رموز التحقق للإصدارات الصوتية ، يلزم Freetts. تم استخدام اختبار Captcha الكامل بالكامل التلقائي تمامًا لإخبار أجهزة الكمبيوتر والبشر أولاً كمشروع بحثي علمي في جامعة كارنيجي ميلون. تم استخدامه لإنشاء اختبار يسهل على البشر المرور ولكن يصعب على أجهزة الكمبيوتر. يستخدم حاليًا على نطاق واسع في تطبيقات الشبكة ويستخدم لمنع الروبوتات من نشر معلومات البريد العشوائي. حاليًا ، يوضح موقع JCaptcha الرسمي أن هناك الإصدار 2.0 ، ولكن الإصدار الثنائي هو الإصدار 1.0 فقط للتنزيل.
أولاً نحتاج إلى إعداد حزمة الجرة المقابلة
في تنفيذ مشروع JCAPTCHA ، يشير أيضًا إلى مشروعين مفتوحين المصدر ، ومسارات العموم وجلد العموم. بالإضافة إلى ذلك ، فإن تنفيذ JCaptcha نفسه ، نحتاج إلى ثلاث حزم في المجموع ، والمعلومات المحددة هي كما يلي:
jcaptcha -2.0-all.jarcommons-logging-1.1.1.jarcommons-collections-3.2.jar
ثانياً ، دعونا نلقي نظرة على معلومات التكوين الرئيسية في web.xml أدناه: بالإضافة إلى تكوين مسار الفئة المحدد لمكون JCaptCha ، يتم أيضًا تكوين SridtActionServlet ، والذي يتم استخدامه كخدمة في رموز التحقق من المقارنة ، ويتم تعيين كلاهما. يمكن فهمه على أنه تغيير الاسم. عند الاتصال بالمكون أو servlet في /jcaptcha.jpg و /submit.action ، على التوالي ، يمكن استخدامه مباشرة لاستخدام اسم الخرائط هذا.
<Sradlet> <Sradlet-Name> jcaptcha </revlet-name> <Servlet-class> com.octo.captcha.mode.servlet.image.simpleimageCaptChaservlet </servlet-class> </servlet> <Servlet> </servlet-name> <Srevlet-class> com.octo.captcha.module.servlet.image.sample.submitactionservlet </servlet-class> </servlet> <Servlet-mapping> <vervlet-name> jcaptcha </revlet-name> <stervlet-name> إرسال </servlet-name> <url-pattern> /submit.action </url-pattern> </servlet-mapping>
web.xml
ثم دعونا نرى كيف يتم تنفيذ SubmitActionServlet: نظرًا لأن حزمة مكون JCAPTCHA يتم استيرادها ، يتم استدعاء الطريقة المغلفة SimpleImageCaptChaserVlet.validateresponse (الطلب ، USERCAPTCHARPERSE) مباشرة لتحديد ما إذا كانت المعلومات في رمز التحقق تطابق التقديم ، دون النظر في عملية التنفيذ المحددة.
يمتد فئة Public ClasseCtionServlet httpservlet {محمية void dopost (طلب httpservletrequest ، httpservletresponse) يلقي servletexception ، ioexception {String userCaptCarSponse = request.getParameter ("japtcha") ؛ boolean captchapassed = simpleimageCaptChaservlet.Validateresponse (request ، UserCaptCarSponse) ؛ إذا (captchapassed) response.getWriter () else {desponse.getWriter (). الكتابة ("فشل captcha") ؛ } reponse.getWriter (). الكتابة ("<br/> <a href = 'index.jsp'> حاول مرة أخرى </a>") ؛ }} submitactionservlet أخيرًا ، دعنا نلقي نظرة على مكالمة مكتب الاستقبال البسيط:
<html> <body> <h> Simple Captcha servlet sample </h> <form Action = "submit.Action" method = "post"> <img src = "jcaptcha.jpg"/> <input type = "text" name = "japtcha" value = ""
أسطورة التنفيذ:
الطريقة 4:
تم تنفيذها مع مكون المصدر المفتوح Kaptcha. يتطلب استخدام Kaptcha أيضًا تنزيل حزمة مكونات JAR الخاصة بها. Kaptcha هي أداة لتوليد رمز التحقق العملية للغاية. مع ذلك ، يمكنك إنشاء رموز التحقق من أنماط مختلفة لأنها قابلة للتكوين. يتمثل مبدأ Kaptcha Works في الاتصال بـ com.google.code.kaptcha.servlet.kaptchaservlet (يمكن ملاحظة أنه مشروع مفتوح المصدر من Google) لإنشاء صورة. في الوقت نفسه ، ضع سلسلة رمز التحقق التي تم إنشاؤها في httpsession.
استخدم kaptcha لتكوينه بسهولة:
رمز التحقق من رمز الخط ، رمز التحقق ، رمز الخط ، رمز التحقق من ، رمز التحقق من ، رمز التحقق ، نطاق المحتوى (الرقم ، الحروف ، الأحرف الصينية!) رمز التحقق ، حجم الصورة ، الحدود ، سماكة الحدود ، خط تداخل رمز التحقق من لون الحدود (يمكنك أن ترث com.google.code.kaptcha.noiseproducer لكتابة خط تدخل مخصص) com.google.code.kaptcha.gimpyengine نمط مخصص)
...
يتم وضع معلومات التكوين الخاصة بـ KaptCha أيضًا في Web.xml: معلومات التكوين المهيئة في علامة <Ing-param>.
<Srevlet> <Servlet-Name> kaptcha </qustlet-name> <Servlet-Class> com.google.code.kaptcha.servlet.kaptchaservlet </servlet-class> <inip-param> <scription> حدود الصورة ، القيمة القانونية: نعم ، لا </description> </ith-param> <Ing-param> <spression> لون الحدود ، القيمة القانونية: R ، G ، B (و alpha اختياري) أو أبيض ، أسود ، أزرق. </description> <Param-name> kaptcha.border.color </param-name> <param-value> Black </param-value> </ith-param> <Ing-param> <Ing-param> <spried> سماكة الحدود ، القيمة القانونية:>/description> </ith-param> <INIT-PARAM> <IRIT-PARAM> <DESPARCE> عرض الصورة </description> <Param-name> kaptcha.image.width </param-name> <param-value> </param-value> </IPAR-PARAM> <Param-value> </parm-value> </ith-param> <Ing-param> <Description> فئة تطبيق الصور </description> <Param-name> kaptcha.producer.impl </param-name> <Param-value> com.google.code.kaptcha.impl.defaultkaptcha فئة التنفيذ </description> <param-name> kaptcha.textproducer.impl </param-name> <Param-value> com.google.code.kaptcha.text.impl.defaultTextCreator </param-value> <Param-name> kaptcha.textproducer.char.string </param-name> <param-value> </parm-value> <!-<param-value> abcdegfynmnpwx </param-value>-> <!- <Description> طول رمز التحقق </description> <param-name> kaptcha.textproducer.char.length </param-name> <param-value> </param-value> </ith-param> <Inig-param> <description> font arial ، courier </description> Courier </param-value> </ith-param> <Ing-param> <Description> حجم الخط px. </description> <param-name> kaptcha.textproducer.font.size </param-name> <parm-value> </parm-value> </ith-param> </description> <Param-name> kaptcha.textproducer.font.color </param-name> <param-value> Black </parm-value> </ith-param> <Init-param> <spare> interdal </description> </ith-param> <INIT-PARAM> <Description> فئة تنفيذ التداخل </description> <Param-name> kaptcha.noise.impl </param-name> <param-value> <!-com.google.code.kaptcha.impl.nonoise- <Ing-param> <specord> لون التداخل ، القيمة القانونية: R ، G ، B أو White ، Black ، Blue. </description> <Param-name> kaptcha.noise.color </param-name> <param-value> Black </param-value> </IPAR ShadowCom.google.code.kaptcha.impl.shadowgimpy </speciped> <Param-name> kaptcha.obscuriphator.impl </param-name> <param-value> com.google> <spression> eventation </descrent> تطبيق خلفية <Param-name> kaptcha.background.impl </param-name> <Param-value> com.google.code.kaptcha.impl.defaultbackground </param-value> </ith-param> <Ing-param> <Description> Background Colort ، بدء لون </description> <param-name> kaptcha.clack <Param-value> أخضر </param-value> </ith-param> <Ing-param> <Description> تدرج اللون الخلفية ، اللون النهائي </description> <Param-name> kaptcha.background.clear.to </param-name> <param-value> وايت </parar-value> <init-param> <Param-name> kaptcha.word.impl </parm-name> <Param-value> com.google.code.kaptcha.text.impl.defaultwordrenderer </param-value> </ith-param> <Ing-param> <spried> مفتاح المفتاح الذي يخزن رمز التحقق في الجلسة </param-name> <Param-value> kaptcha_session_key </param-value> </ith-param> <Ing-param> <Description> تاريخ إنشاء kaptcha في httpsession. هذه هي القيمة الرئيسية لهذا العنصر في الجلسة. </description> <Param-name> kaptcha.session.date </param-name> <param-value> kaptcha_session_date </param-value> </ith-param> </isherlet> <captlet-mapping> <sterlet-name> kaptcha </servlet-name> <Url-pattern>
المكالمة الأمامية: يتم تعيين مسار صورة رمز التحقق باستخدام RandomCode.jpg ، ويقوم Click Event OnClick () باستدعاء وظيفة JS. في نفس الوقت في وظيفة JS يستخدم الوقت الحالي لإبطال ذاكرة التخزين المؤقت للمتصفح لتحديث صورة رمز التحقق.
<html> <Head> <meta http-equiv = "content-type" content = "text/html ؛ charset = utf-"> <title> عشوائي </title> <script type = "text/javaScript"> changer (node) {// تستخدم لإنشاء رموز التحقق المختلفة عند النقر فوق node.src = " Date (). getTime () ؛ } </script> </head> <body> <img src = "randomcode.jpg" onClick = "changer (this)" style = "cursor: pointer ؛"> <form action = "check.jsp"> <input type = "text" name = "r">check.jsp: احصل على معلومات السلسلة في صورة رمز التحقق من خلال (سلسلة) session.getAttribute (com.google.code.kaptcha.constants.kaptcha_session_key) ؛
<html> <head> <meta http-equiv = "content-type" content = "text/html ؛ charset = utf-"> <title> تحقق من </title> </head> <body> <٪ // تحقق إذا كان هذا هو رمز الفحص الصحيح k = (string). String str = request.getParameter ("r") ؛ if (k.equals (str)) out.print ("true") ؛ out.print (k + "---" + str) ؛ ٪> </body> </html>أسطورة التنفيذ:
يمكننا أن نجد أن رموز التحقق الخاصة بنا أصبحت أكثر ملونة ، لكننا ما زلنا في مرحلة التحقق من الحروف والأرقام الإنجليزية فقط. فهل يمكننا أن نلعب بعض تلك الراقية؟ الجواب نعم. بعد ذلك ، دعونا نلقي نظرة على كيفية تنفيذ رموز التحقق الصينية ورموز التحقق من الحساب. كلهم يحتاجون فقط إلى تعديله بناءً على الاستخدام أعلاه للكبوتشا.
تنفيذ رمز التحقق الصيني:
أولاً ، نجد ملف DefaultTextCreator.Class Bytecode ضمن حزمة Kaptcha.jar. كما يوحي الاسم ، فهو فئة لإنشاء نص في رمز التحقق. يمكننا تنفيذ فئة ورثتها من قبل أنفسنا ، واستخدام فئة التنفيذ الخاصة بنا لجعل النص في رمز التحقق الصيني من خلال التكوين. بعد فك الإلغاء التالي ، يمكننا أن نرى أنه يتم تنفيذه بهذه الطريقة. يتم استخدام وظيفة getText () لإنشاء نص رمز التحقق الذي ستقدمه تكوين GetConfig () ، لذلك نحتاج فقط إلى ورث فئة التكوين وتنفيذ واجهة توليد النص والكتابة فوق طريقة getText ().
يمتد الفئة العامة DefaultTextCreator الأدوات القابلة للتكوين textProducer {public string getText () {int length = getConfig (). getTextProducerCharlength () ؛ char [] chars = getConfig (). getTextProducerCharString () ؛ int RandomContext = chars.length - ؛ Rand Rand = New Random () ؛ text stringBuffer = new StringBuffer () ؛ لـ (int i = ؛ i <length ؛ i ++) {text.append (chars [(rand.nextint (randomcontext)+)]) ؛ } return text.toString () ؛ }}ما يلي هو التنفيذ المحدد لـ chinesetext.java: يقوم البرنامج فقط بتنفيذ الكود في getText (). الكود الأصلي مكتوب في getText1 () ولا ينفذه. يمكنك إجراء مقارنة.
يمتد chinesetext الفئة العامة الأدوات القابلة للتكوين textProducer {public string getText () {int length = getConfig (). getTextProducerCharLength () ؛ // char [] chars = getConfig (). getTextProducerCharString () ؛ string [] s = new string [] {"i" ، "love" ، "tab" ، "trow" و "،" sell "،" screw "،" button "} ؛ random rand = new random () ؛ stringbuffer sb = new stringbuffer () ؛ for (int i = ؛ i <length ؛ i ++) {in ind. SB.ToString () ؛ "" ، "،" A "،" B "،" C "،" D "،" E "،" F "} ؛ Rand Rand = New Random () ؛ لـ (int i = ؛ i <length ؛ i ++) {switch (rand.nextint (array.length)) {case: tempint = rand.nextint ()+؛ firstword = string.valueof ((char) tempint) ؛ استراحة؛ الحالة: int r ، r ، r ، r ؛ String strh ، strl ؛ // High & Low r = rand.nextint () + ؛ // أغلق الأمامي وفتح [،) if (r ==) {r = rand.nextint () ؛ } آخر {r = rand.nextint () ؛ } r = rand.nextint () + ؛ if (r ==) {r = rand.nextint () + ؛ } آخر إذا (r ==) {r = rand.nextint () ؛ } آخر {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 = سلسلة جديدة (بايت) ؛ استراحة؛ الافتراضي: tempint = rand.nextint () + ؛ firstword = string.valueof ((char) tempint) ؛ استراحة؛ } finalword += firstword ؛ } إرجاع الكلمات النهائية ؛ }}الخطوة الأخيرة هي تغيير قيمة فئة تنفيذ النص في web.xml ، بحيث يقوم المكون باستدعاء الفئة التي يكتبها لإنشاء رمز التحقق الصيني.
<IRIT-PARAM> <Description> فئة تنفيذ النص </description> <Param-name> kaptcha.textproducer.impl </param-name> <param-value> chinesetext </param-value> </init-param>
أسطورة التنفيذ:
تنفيذ رمز التحقق من العملية الحسابية:
مثل رمز التحقق الصيني المذكور أعلاه ، نحتاج إلى تنفيذ فئتنا الخاصة من خلال ورث الفئات والواجهات ، وإعادة كتابة الوظائف الموجودة فيه ، ثم تغيير معلومات التكوين لجعل المكونات تتصل بالفئات التي تنفذها لتحقيق تنويع نموذج رمز التحقق.
رمز ملف KaptChaservlet Bytecode هو كما يلي:
الطبقة العامة kaptchaservlet يمتد httpservlet الأدوات servlet {private properties props = new properties () ؛ المنتج الخاص KaptChaproducer = فارغ ؛ سلسلة خاصة SessionKeyValue = null ؛ public void init (servletConfig conf) يلقي servleTexception {super.init (conf) ؛ imageio.setuseCache (false) ؛ التعداد <؟> initParams = conf.getInitParameterNames () ؛ بينما (initparams.hasmoreElements ()) {string key = (string) initParams.NextElement () ؛ قيمة السلسلة = conf.getInitParameter (مفتاح) ؛ this.props.put (المفتاح ، القيمة) ؛ } config config = config config (this.props) ؛ this.kaptChaproducer = config.getProducerImpl () ؛ this.sessionKeyValue = config.getSessionKey () ؛ } public void dogge (httpservletrequest req ، httpservletresponse resp) يلقي servletexception ، ioException {resp.setDateHeader ("Expires" ، l) ؛ Resp.Setheader ("Cache-Control" ، "No Store ، No Clim ، يجب إعادة تقييم") ؛ resp.addheader ("Cache-Control" ، "postcheck = ، pre-check =") ؛ Resp.Setheader ("pragma" ، "no-cache") ؛ Resp.SetContentType ("Image/JPEG") ؛ string captext = this.kaptChaproducer.createText () ؛ req.getSession (). BufferedImage Bi = this.kaptChaproducer.CreateImage (captext) ؛ servleToutPutStream Out = resp.getOutputStream () ؛ imageio.write (Bi ، "JPG" ، Out) ؛ حاول {out.flush () ؛ } أخيرًا {out.close () ؛ }}}بعد ذلك ، فإن رمز kaptchaservlet.java الذي قمت بتطبيقه بنفسي هو كما يلي: المنطق المضافة إلى ملف Bytecode الأصلي لتنفيذ رمز التحقق من الإضافة ، ويمكنك اكتشافه من خلال المقارنة.
الطبقة العامة KaptChaservlet يمتد httpservlet الأدوات servlet {Private Properties Props ؛ المنتج الخاص KaptChaproducer ؛ سلسلة خاصة SessionKeyValue ؛ kaptchaservlet العامة () {this.props = new properties () ؛ this.kaptChaproducer = null ؛ this.sessionKeyValue = null ؛ } public void init (servletconfig conf) يلقي servletexception {super.init (conf) ؛ imageio.setuseCache (false) ؛ التعداد initParams = conf.getInitParameterNames () ؛ بينما (initparams.hasmoreElements ()) {string key = (string) initParams.NextElement () ؛ قيمة السلسلة = conf.getInitParameter (مفتاح) ؛ this.props.put (المفتاح ، القيمة) ؛ } config config = config config (this.props) ؛ this.kaptChaproducer = config.getProducerImpl () ؛ this.sessionKeyValue = config.getSessionKey () ؛ } public void dogge (httpservletrequest req ، httpservletresponse resp) يلقي servletexception ، ioException {resp.setDateHeader ("Expires" ، l) ؛ Resp.Setheader ("Cache-Control" ، "No Store ، No Clim ، يجب إعادة تقييم") ؛ resp.addheader ("Cache-Control" ، "postcheck = ، pre-check =") ؛ Resp.Setheader ("pragma" ، "no-cache") ؛ Resp.SetContentType ("Image/JPEG") ؛ string captext = this.kaptChaproducer.createText () ؛ سلسلة s = captext.substring (،) ؛ سلسلة s = captext.substring (،) ؛ int r = integer.valueof (s) .intvalue () + integer.valueof (s) .intvalue () ؛ req.getSession (). BufferedImage Bi = this.kaptChaproducer.CreateImage (S+"+"+S+"=؟") ؛ servleToutPutStream Out = resp.getOutputStream () ؛ imageio.write (Bi ، "JPG" ، Out) ؛ حاول {out.flush () ؛ } أخيرًا {out.close () ؛ }}}نحتاج أيضًا إلى تغيير التكوين في بداية web.xml لجعل المكون يدعو إلى servlet الذي قمت بتطبيقه:
<Srevlet-Name> Kaptcha </servlet-name> <Servlet-Class> KaptChaservlet </revlet-class>
أسطورة التنفيذ:
تلخيص:
هذا مجرد تطبيق بسيط لرمز التحقق ، لكنه لا يزال بعيدًا عن استخدامه للمشاريع التجارية. إذا لم يتم تصدع رمز التحقق ، فيجب إضافة خوارزميات التشفير المختلفة. ومع ذلك ، يمكنك البحث عن رمز التحقق المتصدع في كل مكان. توجد قاعدة بيانات تحت الأرض على الإنترنت ، والتي تخزن معلوماتنا الشخصية. يتم فرز المعلومات واحدة تلو الأخرى ، وهو أمر فظيع للغاية. ومع ذلك ، فإن قاعدة البيانات هذه موجودة بموضوعية. أصبحت رموز التحقق ، كجزء مهم من حماية كلمات مرور الحساب ، غير آمنة بشكل متزايد. بسبب تسرب المعلومات الشخصية ، يمكن للآخرين ارتكاب الاحتيال عليك بعد أن يكون لديهم معلومات كافية عنك. من بينها ، رموز التحقق جزء مهم. في الآونة الأخيرة ، تم إخفاء الحادث الذي تم فيه خداع خريج في الحصول على رموز التحقق وتم نقل كل ثروته في غضون ساعات قليلة. لذا يرجى حماية رمز التحقق الخاص بك ولا تكشفه بسهولة للآخرين.
بالطبع ، لن نجلس صامتة وننتظر الموت. أصبحت الأنواع الحالية من رموز التحقق صعبة بشكل متزايد. مثل التعرف على الصوت والتعرف على الوجه كلها مألوفة ، لذلك لن أقول الكثير.
هنا نقدم مفهوم "جديد" لرمز التحقق: مصادقة ثنائية العوامل.
المصادقة ثنائية العوامل هي نظام يستخدم تقنية مزامنة الوقت ، والذي يستخدم كلمة مرور لمرة واحدة تم إنشاؤها استنادًا إلى المتغيرات الثلاثة للوقت والحدث والمفتاح لاستبدال كلمة المرور الثابتة التقليدية. تحتوي كل بطاقة كلمة مرور ديناميكية على مفتاح فريد ، يتم تخزينه على جانب الخادم في نفس الوقت. في كل مرة يقوم فيها بطاقة كلمة المرور الديناميكية والخادم بحساب كلمة المرور الديناميكية المصادقة بناءً على نفس المفتاح ، ونفس المعلمات العشوائية (الوقت ، الحدث) ونفس الخوارزمية ، وبالتالي ضمان اتساق كلمة المرور وتحقيق مصادقة المستخدم. نظرًا لأن المعلمات العشوائية مختلفة أثناء كل مصادقة ، فإن كلمة المرور الديناميكية التي يتم إنشاؤها في كل مرة تختلف أيضًا. نظرًا لأن العشوائية للمعلمات أثناء كل عملية حساب يضمن عدم القدرة على التنبؤ بكل كلمة مرور ، فإن عملية مصادقة كلمة المرور الأساسية تضمن أمان النظام. حل الخسائر الرئيسية الناجمة عن احتيال كلمة المرور ، ومنع المتسللين الخبيثين أو الأضرار الاصطناعية ، وحل مشكلة التسلل الناجمة عن تسرب كلمة المرور.
ببساطة ، فإن مصادقة الهوية ثنائية العوامل هي نظام مصادقة للهوية لا يمكنه العمل إلا من خلال مزيج ما تعرفه والعنصرين اللذين يمكن أن يكون لديك. على سبيل المثال ، تعد بطاقة البنوك التي تسحب الأموال من أجهزة الصراف الآلي مثالًا على آلية المصادقة ثنائية العوامل. تحتاج إلى معرفة مجموعة كلمة مرور السحب والبطاقة المصرفية قبل أن تتمكن من استخدامها. حاليًا ، يعتمد نظام المصادقة السائد ثنائي العوامل على مزامنة الوقت ولديه حصة في السوق العالية. نظام المصادقة ثنائي العوامل DKEY ، ونظام مصادقة RSA ثنائي العوامل ، وما إلى ذلك. نظرًا لأن DKEY يزيد من دعم مصادقة كلمة مرور الرسائل النصية القصيرة ومصادقة SMS + Token Hybrid ، فإن نظام المصادقة ثنائي العوامل أكثر تنافسية من RSA.
ما سبق هو المحتوى ذي الصلة لإنتاج رمز التحقق من Java الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك!