개발을 전문으로 행복 디즈니 응용 프로그램 개발 회사

  해피 디즈니 시스템 개발 "폰 건강"[191﹎5743﹍0738] [V] 또는 전기 기쁨 디즈니 모델 개발, 응용 프로그램 개발 디즈니 기쁨, 디즈니 플랫폼 개발의 즐거움, 디즈니 소프트웨어 개발의 기쁨. 해피 디즈니 소스 개발 시스템입니다. 디즈니 모드 응용 시스템의 사용자 정의 개발의 기쁨과 유사 해피 디즈니 모델 시스템의 사용자 정의 개발, 기쁨 디즈니 모드 소프트웨어 정의 개발, 모델 개발의 경우와 유사 디즈니, 개발을 전문으로 디즈니 기쁨 시스템 개발 회사, 응용 프로그램 개발 전문 기쁨 디즈니 개발 회사의 기쁨을 설명합니다

  ------ 팁 : 전문 개발 회사, 비 자 플랫폼, 플레이어는 개의치하지 ------

  대부분의 백엔드 코드는 온라인, 바로 테스트가 가능 찾을 수

  패키지 com.bessky.hrmis.common.rbac.encrypt;

  수입 java.security.InvalidKeyException;

  수입 java.security.NoSuchAlgorithmException;

  수입 java.security.SecureRandom의;

  수입 javax.crypto.Mac;

  수입하는 javax.crypto.spec.SecretKeySpec;

  수입 org.apache.commons.codec.binary.Base32;

  수입 org.apache.commons.codec.binary.Base64;

  / **

  *

  *

  * 구글 인증, 자바 서버를 달성하기 위해

  * /

  공용 클래스 GoogleAuthenticator {

  // 생성 된 키 길이는 (비밀 키 길이를 생성)

  공공 정적 최종 INT의 SECRET_SIZE = 10;

  공공 정적 최종 문자열 SEED = "g8GjEvTbW5oVSV7avL47357438reyhreyuryetredLDVKs2m0QN7vxRs2im5MDaNCWGmcD2rvcZx";

  // 자바 달성하기 위해 난수 알고리즘

  공공 정적 최종 문자열 RANDOM_NUMBER_ALGORITHM = "SHA1PRNG";

  // 최대 시간 오프셋

  INT WINDOW_SIZE = 10; // 기본 3 최대 17

  / **

  * 윈도우 size.This을 설정하는 단계의 개수를 나타내는 정수 값이며

  * 30 번째 Windows는 우리의 더 관대 창 더 큰 허용

  * 클럭 스큐 우리가 있습니다.

  *

  정지 *의

  * 윈도우 크기해야 할 하였다 = 1 및 | ≤ 17.Other 값 무시

  * /

  공공 무효 setWindowSize (INT s의) {

  경우 (S된다 = 1 && s 인 것이 = 17)

  = s의 WINDOW_SIZE;

  }

  / **

  * 생성 임의의 비밀 key.This가 서버에서 저장해야하며,

  * 사용자와 관련된 구글에 의해 표시되는 코드를 확인하기 위해 계정

  * Authenticator.The 사용자는 자신의 디바이스에이 비밀을 등록해야합니다.

  * 임의의 비밀 키를 생성

  *

  * 반환 비밀 키

  * /

  공공 정적 문자열 generateSecretKey () {

  SecureRandom의 SR = NULL;

  시험{

  SR = SecureRandom.getInstance (RANDOM_NUMBER_ALGORITHM);

  sr.setSeed (Base64.decodeBase64 (SEED.getBytes ()));

  바이트 [완충액 = sr.generateSeed (SECRET_SIZE);

  Base32 코덱 새로운 Base32 = ();

  바이트 [] = bEncodedKey codec.encode (버퍼);

  문자열 encodedKey = 새로운 String (bEncodedKey);

  encodedKey를 반환;

  } 캐치 (예외 : NoSuchAlgorithmException 전자) {

  // 구성 오류 ... 발생해서는 안

  }

  NULL을 반환;

  }

  / **

  * 구글 인증 식별 문자열을 생성, 방법은 값이 바로 이차원 코드를 스캔 할 수 있습니다 생성 할 필요가 반환합니다.

  * PARAM 라벨

  * 라벨

  * 사용자 PARAM

  * 계정

  * PARAM 비밀

  * 키

  * 반환

  * /

  공공 정적 문자열 getQRBarcode (문자열 레이블을 문자열 사용자 문자열 비밀) {

  문자열 형식 = "otpauth : // TOTP / % S : % s의 비밀 = % s '에;

  및 String.format (형식, 레이블, 사용자, 비밀을) 반환;

  }

  / **

  * 구글 인증 식별 문자열을 생성, 방법은 값이 바로 이차원 코드를 스캔 할 수 있습니다 생성 할 필요가 반환합니다.

  *

  * 사용자 PARAM

  * 계정

  * PARAM 비밀

  * 키

  * 반환

  * /

  공공 정적 문자열 getQRBarcode (문자열 사용자 문자열 비밀) {

  문자열 형식 = "otpauth : // TOTP / %의 비밀 = % s '에;

  반환 및 String.format (형식, 사용자, 비밀);

  }

  / **

  *이 유효 验证 코드 是否이 있는지 확인하기 위해 사용자가 입력 한 코드를 확인 合法

  *

  * PARAM 비밀

  * 비밀 사용자.

  * PARAM 코드

  * 코드는 사용자 장치에 디스플레이

  * t의 param

  * (예에 System.currentTimeMillis ()) 밀리 세컨드 시간

  * 반환

  * /

  공공 부울 check_code (문자열 비밀, 긴 코드, 긴 timeMsec) {

  (비밀 == NULL의 || "". 동일 (비밀)) 경우

  {

  false를 반환;

  }

  Base32 코덱 새로운 Base32 = ();

  바이트 [] = decodedKey codec.decode (비밀);

  // 30 초 "창"으로 유닉스에게 밀리 초 시간을 변환

  //이 (자세한 내용은 RFC를 참조) TOTP 사양에 따라입니다

  긴 t = (timeMsec / 1000L) / (30L);

  // 창은 가까운 과거에 생성 된 코드를 확인하는 데 사용됩니다.

  // 당신은 당신이 가야 할 금액까지 조정이 값을 사용할 수 있습니다.

  대 (INT -window_size I = i를 LT = WINDOW_SIZE; I ++) {

  긴 해시;

  시험{

  해시 = verify_code (decodedKey, t + I);

  } 캐치 (예외 전자) {

  // 네,이 나쁜 형태-하지만,

  // 던져 예외는 희귀하고 정적 인 것

  // 구성 문제

  e.printStackTrace ();

  새로운 RuntimeException을 던져 (e.getMessage ());

  false를 반환 //;

  }

  경우 (== 해시 코드) {

  true를 반환;

  }

  }

  // 유효성 검사 코드가 잘못되었습니다.

  false를 반환;

  }

  개인 정적 INT의 verify_code (바이트 [] 키 길이 t)의 경우 NoSuchAlgorithmException, InvalidKeyException를 발생 {슬로우

  바이트 [] = 새로운 데이터 바이트 [8];

  긴 값 = t;

  대해 INT (I = 8, I -있다 0] 값이된다된다된다 = 8) {

  데이터 <난> = (바이트) 값;

추천

출처www.cnblogs.com/dfdsf123/p/11766570.html