다음으로 Java Verification Code Production (1 부)의 이전 기사에서 Java Verification Code에 대한 관련 지식을 소개합니다!
메소드 3 :
오픈 소스 구성 요소 JCAPTCHA와 함께 스프링과 결합하여 다양한 형태의 검증 코드를 생성 할 수 있습니다. JCAPTCHA는 Captcha Project의 Java 버전입니다. 그래픽 및 사운드 버전의 검증 코드 생성을 지원하는 오픈 소스 프로젝트입니다. 사운드 버전에 대한 검증 코드를 생성 할 때는 Freetts가 필요합니다. Captcha의 전체 이름은 컴퓨터와 인간을 차별화시켜 Carnegie Mellon University의 과학 연구 프로젝트로 처음 사용되었습니다. 인간이 쉽게 통과 할 수 있지만 컴퓨터가 통과하기 어려운 테스트를 생성하는 데 사용되었습니다. 현재 네트워크 응용 프로그램에서 널리 사용되며 로봇이 스팸 정보를 게시하는 것을 방지하는 데 사용됩니다. 현재 공식 JCAPTCHA 웹 사이트는 버전 2.0이 있지만 이진 버전은 다운로드의 경우 1.0 버전 일뿐입니다.
먼저 해당 JAR 패키지를 준비해야합니다
JCAPTCHA 프로젝트의 구현에서, 그것은 두 가지 오픈 소스 프로젝트, 커먼즈 컬렉션 및 커먼즈 로깅을 참조합니다. 또한 JCAPTCHA 자체의 구현에는 총 3 개의 패키지가 필요하며 특정 정보는 다음과 같습니다.
JCAPTCHA-2.0-ALL.JARCOMMONS-LOGGING-1.1.1.JARCOMMONS-COLLECTIOS-3.2.JAR
둘째, 아래의 Web.xml의 주요 구성 정보를 살펴 보겠습니다. JCAPTCHA 구성 요소의 특정 클래스 경로를 구성하는 것 외에도 제출 ActionServlet도 구성되며 비교 검증 코드를위한 서블릿으로 사용되며 둘 다 매핑됩니다. 이름을 바꾸는 것으로 이해할 수 있습니다. /jcaptcha.jpg 및 /submit.action에서 구성 요소 또는 서블릿을 호출 할 때이 매핑 이름을 직접 사용하는 데 직접 사용할 수 있습니다.
<Servlet> <servlet-name> jcaptcha </servlet-name> <servlet-class> com.octo.captcha.module.servlet.image.simpleimagecaptchaservlet </servlet-class> </servlet> <servlet> <servlet-name> 제출 </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 </servlet-mapping> <Servlet-name> 제출 </servlet-name> <Url-pattern> /submit.action </url-pattern> </servlet-mapping>
web.xml
그런 다음 제출 기능을 구현하는 방법을 살펴 보겠습니다. JCAPTCHA 구성 요소 패키지가 가져 오기 때문에 캡슐화 된 방법 SimpleimageCaptChaservlet.ValidaterSponse (request, usercaptCharesponse)는 특정 구현 프로세스를 고려하지 않고 검증 코드의 정보가 제출물과 일치하는지 여부를 결정합니다.
공개 클래스 제출 actionservlet는 httpservlet {protected void dopost (httpservletrequest request, httpservletresponse response)를 servletexception, ioexception {string usercaptcharesponse = request.getParameter ( "japtcha"); 부울 CAPTCHAPASSED = SimpleImageCaptChaservlet.ValidaterSponse (request, usercaptcharesponse); if (captChaPassed) response.getWriter (). 쓰기 ( "Captcha Passed"); else {response.getWriter (). 쓰기 ( "Captcha 실패"); } response.getWriter (). 쓰기 ( "<br/> <a href = 'index.jsp'> 다시 시도 </a>"); }} admplicationservlet 마지막으로 간단한 프론트 데스크 통화를 살펴 보겠습니다.
<html> <body> <h> 간단한 Captcha servlet 샘플 </h> <form action = "down.action"methove = "post"> <img src = "jcaptcha.jpg"/> <input type = "text"name = "japtcha"value = ""/> <input type = "/> </body> </html> </html> </html>
구현 범례 :
Method 4:
오픈 소스 구성 요소 Kaptcha와 함께 구현되었습니다. 또한 Kaptcha를 사용하려면 JAR 구성 요소 패키지를 다운로드해야합니다. Kaptcha는 매우 실용적인 검증 코드 생성 도구입니다. 이를 통해 구성 가능하기 때문에 다양한 스타일의 검증 코드를 생성 할 수 있습니다. Kaptcha Works의 원칙은 이미지를 생성하기 위해 com.google.code.servlet.kaptchaservlet (Google의 오픈 소스 프로젝트임을 알 수 있음)을 호출하는 것입니다. 동시에 생성 된 검증 코드 문자열을 httpsession에 넣으십시오.
Kaptcha를 사용하여 편리하게 구성하십시오.
검증 코드 글꼴 크기 검증 코드 글꼴 크기 검증 코드 글꼴 색상 확인 코드 콘텐츠 범위 (번호, 문자, 중국인!) 검증 코드 사진 크기, 테두리, 테두리 두께, 테두리 색상 검증 코드 간섭선 (com.google.code.kaptcha.noiseproducer) 검증 코드 스타일 (Fisheye Style, 3D, Accist). com.google.code.kaptcha.gimpyengine 사용자 정의 스타일)
...
KAPTCHA의 구성 정보는 Web.xml : 초기화 된 구성 정보 <init-param> 태그에도 배치됩니다.
<Servlet> <Servlet-name> KAPTCHA </servlet-name> <servlet-class> com.google.code.kaptcha.servlet.kaptchaservlet </servlet-class> <Init-Param> <descriemation> 이미지 테두리, 법적 가치 : 예, no </descrip> <param-name> kaptcha.border </param-name> </init-param> <init-param> <description> 테두리 색상, 법적 가치 : R, G, B (및 선택적 알파) 또는 흰색, 검은 색, 파란색. </description> <param-name> kaptcha.border.color </param-name> <param- value> black </param- value> </init-param> <init-param> <init-param> <description> 테두리 두께, 법적 가치 :>/description> <param-name> kaptcha.border.thickness </param-name> </init-param> <init-param> <init-param> <descriemation> 이미지 너비 </descript> <param-name> kaptcha.image.width </param-name> <param- value> </param-value> </init-param> <init-param> <description> image high </description> kaptcha.image.height.height. <Param-value> </param- value> </init-param> <init-param> <description> 이미지 구현 클래스 </descried </descriper> <param-name> kaptcha.producer.impl </param-name> <param-value> com.google.code.kaptcha.impl.defaultkaptcha </param- value> initparam> </initparam> 클래스 </descriptcha.textProducer.impl </param-name> <param-value> com.google.code.kaptcha.text.impl.defaultTextCreator </param-value> </init-param> <init-param> <description> 텍스트 컬렉션에서 얻은 </param-value> </init-param> </param-value> </param-value> </initification code value </init-param> <init-param> <description> <Param-Name> kaptcha.textProducer.char.string </param-name> <param-value> </param-value> <!-<param- value> abcdegfynmnpwx </param-value>-> <!-<param-value> mooch.com Tutorial Verification Code </param- value>-</init-param> <cression> 검증 코드 길이 </descript> <param-name> kaptcha.textProducer.char.length.length </param-name> <param-value> </param- value> </init-param> <init-param> <description> 글꼴, 택배 </descrip> <param-name> kaptcha.textProducer.names.names.names.names.names.font.names.font.names. 택배 </param-value> </init-param> <init-param> <description> font size px. </descript> <param-name> kaptcha.textProducer.font.size </param-name> <param- value> </param- value> </init-param> <description> font values, g, g, b, b, b. </description> <param-name> kaptcha.textProducer.font.color </param-name> <param-value> black </param-value> </init-param> <init-param> <description> 텍스트 간격 </descripal> <param-name> kaptcha.textProducer.space </param-name> <param- value> </init-param> <init-param> <description> 간섭 구현 클래스 </description> <param-name> kaptcha.noise.impl </param-name> <param-value> <!-com.google.code.kaptcha.impl.nonoise-> com.google.code.kaptcha.impl.implnoise </param-val-palue> <init-param> <description> 간섭 색상, 법적 가치 : r, g, b 또는 흰색, 검은 색, 파란색. </descriptcha.noise.color </param-name> <param- value> black </param-value> </init-param> <init-param> <descriemation> 이미지 스타일 : Water-Stitch com.google.code.kaptcha.impl.waterripple budeyecom.google.kaptcha.impl. impl. 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> classe </description> <Param-Name> kaptcha.background.impl </param-name> <param- value> com.google.code.kaptcha.impl.defaultbackground </param- value> </init-param> <Init-param> <descript> 배경색 기울기, 시작 색상 </description> <param-name> kaptcha.back.back.from. <Param-Value> Green </param-value> </init-param> <Init-Param> <description> 배경 색상 그라디언트, 끝 색상 </descript> <param-name> kaptcha.background.clear.to </param-name> <param-value> 화이트 </param-value> </init-param> init-param> </descripter> description> 설명. <Param-Name> kaptcha.word.impl </param-name> <param-value> com.google.code.kaptcha.text.impl.defaultwordrenderer </param- value> </init-param> <description> 세션에 검증 코드를 저장하는 키 키 </param-name> Kaptcha.s.k.s.s. <Param-value> kaptcha_session_key </param-value> </init-param> <init-param> <description> kaptcha가 생성 된 날짜가 httpsession에 넣습니다. 이것은 세션에서 해당 항목의 핵심 값입니다. </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>/werfattern>
프론트 콜 : 검증 코드 이미지의 경로는 randomcode.jpg와 함께 매핑되며 click event onclick ()는 js 함수를 호출합니다. JS 함수에서 동시에 현재 시간을 사용하여 브라우저 캐시를 무효화하여 확인 코드 이미지를 새로 고칩니다.
<html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-"> <title> random code </title> <script type = "text/javascript"> function changer (node) {// new? src = "randomcode.src ="randomcode.src = "+time을 클릭 할 때 다른 검증 코드를 생성하는 데 사용됩니다. 날짜 (). gettime (); }.Check.jsp : (String) 세션을 통해 검증 코드 사진에서 문자열 정보를 가져옵니다.
<html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-"> <title> check </title> </head> <body> <% // 정확한 확인 코드 k = (문자열) 세션 .kaptcha.constants.kaptcha_seession.); 문자열 str = request.getParameter ( "r"); if (k.equals (str)) out.print ( "true"); out.print (k + "---" + str); %> </body> </html>
구현 범례 :
우리는 우리의 검증 코드가 점점 더 화려 해지고 있음을 알 수 있지만 여전히 영어 문자와 숫자 만 확인하는 단계에 있습니다. 그래서 우리는 여전히 고급 고급 연주를 할 수 있습니까? 대답은 예입니다. 다음으로 중국 확인 코드 및 산술 검증 코드를 구현하는 방법을 살펴 보겠습니다. 그들 모두는 위의 Kaptcha 사용에 따라 수정되면됩니다.
중국 확인 코드 구현 :
먼저 kaptcha.jar 패키지 아래에서 defaultTextCreator.class bytecode 파일을 찾을 수 있습니다. 이름에서 알 수 있듯이 검증 코드에서 텍스트를 생성하는 것은 클래스입니다. 우리는 스스로 상속 된 클래스를 구현하고 자체 구현 클래스를 사용하여 구성을 통해 확인 코드의 텍스트를 만듭니다. 다음과 계산 후, 우리는 그것이 그런 식으로 구현되었음을 알 수 있습니다. getText () 함수는 getConfig () configurator가 렌더링하는 검증 코드 텍스트를 생성하는 데 사용되므로 구성 클래스를 상속하고 텍스트 생성 인터페이스를 구현하고 getText () 메소드를 덮어 쓰면됩니다.
public class defaulttextcreator는 구성 가능한 구현 텍스트 프로듀서 {public String getText () {int longth = getConfig (). getTextProduceerCharlength (); char [] chars = getConfig (). getTextProducerCharstring (); int randomcontext = chars.length-; 랜덤 rand = 새로운 랜덤 (); StringBuffer text = new StringBuffer (); for (int i =; i <length; i ++) {text.append (chars [(rand.nextint (randomcontext)+)]); } return text.toString (); }}다음은 chinesetext.java의 특정 구현입니다. 프로그램은 getText ()에서 코드 만 실행합니다. 원래 코드는 getText1 ()에 작성되었으며 실행되지 않습니다. 당신은 비교할 수 있습니다.
public class chinesetext는 구성 가능한 구현 텍스트 프로듀서 {public string getText () {int longth = getConfig (). getTextProduceerCharlength (); // char [] chars = getConfig (). getTextProducerCharstring (); string [] s = new String [] {] { "i", "love", "tab", "trow"및 "soll", "screw", "screw", "button"}; random rand = new random (); stringbuffer sb = new StringBuffer (); for (int i =; i <longth; i ++) {int = rand.nextint (s.length); sb.append (s ind);} sb.toString ()}; @Erturn* / public string getText (). getTextProduceRcharlength = ""; "", ","a ","b ","c ","d ","e ","f "}; 랜덤 rand = 새로운 랜덤 (); for (int i =; i <length; i ++) {switch (rand.nextInt (array.length)) {case : tempint = rand.nextInt ()+; firstword = string.valueof ((char) tempint); 부서지다; 사례 : int r, r, r, r; 문자열 strh, strl; // High & Low r = rand.nextInt () +; // 전면을 닫고 열기 [,) 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 = 배열 [r] + 배열 [r]; strl = 배열 [r] + 배열 [r]; 바이트 [] 바이트 = 새로운 바이트 []; 바이트 [] = (byte) (integer.parseint (strh,)); 바이트 [] = (byte) (integer.parseint (strl,)); firstword = 새 문자열 (바이트); 부서지다; 기본값 : tempint = rand.nextInt () +; firstword = string.valueof ((char) tempint); 부서지다; } finalword += firstword; } return finalword; }}마지막 단계는 web.xml에서 텍스트 구현 클래스의 값을 변경하여 구성 요소가 중국 확인 코드를 생성하기 위해 쓴 클래스를 호출하도록하는 것입니다.
<init-param> <description> 텍스트 구현 클래스 </description> <param-name> kaptcha.textProducer.impl </param-name> <param-value> chinesetext </param- value> </init-param>
구현 범례 :
산술 조작 확인 코드 구현 :
위의 중국 확인 코드와 동일한 경우 클래스 및 인터페이스를 상속하여 자신의 클래스를 구현하고 기능을 다시 작성한 다음 구성 정보를 변경하여 구성 요소가 구현 된 클래스를 호출하여 확인 코드 양식의 다각화를 달성하도록해야합니다.
KaptChaservlet Bytecode 파일의 코드는 다음과 같습니다.
공개 클래스 KAPTCHASERVLET 확장 httpservlet emplements servlet {private properties propss = new Properties (); 민간 생산자 kaptchaproducer = null; 개인 문자열 sessionKeyValue = null; public void init (servletconfig conf) servletexception {super.init (conf); imageio.setUsecache (false); 열거 <?> initparams = conf.getInitParameterNames (); while (initparams.hasmoreElements ()) {String key = (string) initParams.nextElement (); 문자열 값 = conf.getInitParameter (키); this.props.put (키, 값); } config config = 새 구성 (this.props); this.kaptchaproducer = config.getProduceRimpl (); this.sessionkeyValue = config.getSessionKey (); } public void doget (httpservletRequest req, httpservletResponse resp) servletexception, ioexception {resp.setDateHeader ( "expires", l); resp.SetHeader ( "캐시 제어", "없음 스토어, 없음, 캐시가 없음, 꼭 봐야 할 반복"); resp.AddHeader ( "캐시 제어", "post-check =, pre-Check ="); Resp.Setheader ( "Pragma", "No-Cache"); resp.setContentType ( "image/jpeg"); 문자열 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); {out.flush (); } 마침내 {out.close (); }}}그런 다음 직접 구현 한 kaptchaservlet.java 코드는 다음과 같습니다. 원래 바이트 코드 파일에 추가로 논리를 추가하여 추가 확인 코드를 구현하면 비교를 통해이를 발견 할 수 있습니다.
공개 클래스 KAPTCHASERVLET 확장 httpservlet emplements servlet {private properties propss; 민간 생산자 Kaptchaproducer; 개인 문자열 sessionkeyValue; public 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 (); while (initparams.hasmoreElements ()) {String key = (string) initParams.nextElement (); 문자열 값 = conf.getInitParameter (키); this.props.put (키, 값); } config config = 새 구성 (this.props); this.kaptchaproducer = config.getProduceRimpl (); this.sessionkeyValue = config.getSessionKey (); } public void doget (httpservletRequest req, httpservletResponse resp) servletexception, ioexception {resp.setDateHeader ( "expires", l); resp.SetHeader ( "캐시 제어", "없음 스토어, 없음, 캐시가 없음, 꼭 봐야 할 반복"); resp.AddHeader ( "캐시 제어", "post-check =, pre-Check ="); Resp.Setheader ( "Pragma", "No-Cache"); resp.setContentType ( "image/jpeg"); 문자열 captext = this.kaptchaproducer.createtext (); 문자열 s = captext.substring (,); 문자열 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); {out.flush (); } 마침내 {out.close (); }}}또한 구성 요소를 구현 한 서블릿을 호출하려면 Web.xml의 시작 부분에서 구성을 변경해야합니다.
<Servlet-name> Kaptcha </servlet-name> <servlet-class> Kaptchaservlet </servlet-class>
구현 범례 :
요약 :
이것은 단순한 검증 코드의 간단한 구현 일 뿐이지 만 여전히 상용 프로젝트에 사용하기에 충분하지 않습니다. 검증 코드가 갈라지지 않으면 다양한 암호화 알고리즘을 추가해야합니다. 그럼에도 불구하고, 당신은 모든 곳에서 금이 간 검증 코드를 검색 할 수 있습니다. 인터넷에는 지하 데이터베이스가있어 개인 정보를 저장합니다. 정보는 하나씩 정렬되어 매우 끔찍합니다. 그러나 이러한 데이터베이스는 객관적으로 존재합니다. 계정 비밀번호 보호의 중요한 부분으로서 검증 코드는 점점 안전 해지고 있습니다. 개인 정보의 유출로 인해 다른 사람들은 귀하에 대한 정보가 충분한 후에 사기를 저지를 수 있습니다. 그중에서도 검증 코드가 중요한 부분입니다. 최근에, 졸업생이 검증 코드를 얻는 데 속이고 그의 모든 부는 몇 시간 안에 양도되었습니다. 따라서 확인 코드를 보호하고 다른 사람에게 쉽게 공개하지 마십시오.
물론, 우리는 여전히 앉아서 죽음을 기다리지 않을 것입니다. 현재 유형의 검증 코드가 갈라지기가 점점 어려워지고 있습니다. 음성 인식 및 얼굴 인식과 같은 것은 모두 친숙하므로 많이 말하지 않을 것입니다.
여기서 우리는 "새로운"검증 코드의 "새로운"개념을 소개합니다 : 2 요인 인증.
2 요인 인증은 시간, 이벤트 및 키 변수를 기반으로 생성 된 일회성 비밀번호를 사용하여 기존 정적 비밀번호를 대체하는 시간 동기화 기술을 사용하는 시스템입니다. 각 동적 비밀번호 카드에는 고유 키가 있으며 동시에 서버쪽에 저장됩니다. 동일한 키, 동일한 키, 동일한 랜덤 매개 변수 (시간, 이벤트) 및 동일한 알고리즘을 기반으로 인증 된 동적 암호를 계산할 때마다 암호의 일관성을 보장하고 사용자 인증을 실현할 수 있습니다. 각 인증 중 임의 매개 변수는 다르기 때문에 매번 생성 된 동적 암호도 다릅니다. 각 계산 중 매개 변수의 무작위성은 각 암호의 예측 불가능 성을 보장하기 때문에 가장 기본적인 비밀번호 인증 프로세스는 시스템의 보안을 보장합니다. 암호 사기로 인한 주요 손실을 해결하고 악의적 인 침입자 또는 인공 피해를 방지하며 암호 누출로 인한 침입 문제를 해결하십시오.
간단히 말해서, 2 요인 ID 인증은 자신이 알고있는 것과 가질 수있는 두 가지 요소의 조합을 통해서만 작동 할 수있는 ID 인증 시스템입니다. 예를 들어, ATM에서 돈을 인출하는 은행 카드는 2 단계 인증 메커니즘의 예입니다. 사용하기 전에 인출 비밀번호와 은행 카드의 조합을 알아야합니다. 현재 주류 2 요인 인증 시스템은 시간 동기화를 기반으로하며 시장 점유율이 높습니다. DKEY 2 요인 인증 시스템 , RSA 2 요인 인증 시스템 등 DKEY는 SMS 비밀번호 인증 및 SMS + 토큰 하이브리드 인증에 대한 지원을 증가시키기 때문에 DKEY 2 요인 인증 시스템은 RSA보다 경쟁력이 있습니다.
위는 편집자가 귀하에게 소개 한 Java Verification Code Production의 관련 내용입니다. 나는 그것이 당신에게 도움이되기를 바랍니다!