@@ -153,7 +155,31 @@
spring-expression
${spring.maven.artifact.version}
-
+
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${slf4j.version}
+ runtime
+
+
+ org.slf4j
+ slf4j-log4j12
+ ${slf4j.version}
+ runtime
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j.version}
+
+
commons-fileupload
@@ -368,13 +394,6 @@
commons-lang3
3.3.2
-
-
- javax.servlet
- javax.servlet-api
- 3.1.0
- provided
-
diff --git a/src/main/java/egovframework/com/ext/oauth/web/EgovSignupController.java b/src/main/java/egovframework/com/ext/oauth/web/EgovSignupController.java
deleted file mode 100644
index d6fd4127..00000000
--- a/src/main/java/egovframework/com/ext/oauth/web/EgovSignupController.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * eGovFrame OAuth
- * Copyright The eGovFrame Open Community (http://open.egovframe.go.kr)).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @author 이기하(슈퍼개발자K3)
- */
-package egovframework.com.ext.oauth.web;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.servlet.http.HttpSession;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.social.connect.Connection;
-import org.springframework.social.connect.ConnectionFactoryLocator;
-import org.springframework.social.connect.UserProfile;
-import org.springframework.social.connect.UsersConnectionRepository;
-import org.springframework.social.connect.web.ProviderSignInUtils;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.context.request.WebRequest;
-
-//import egovframework.com.ext.oauth.service.EgovSignupService;
-import egovframework.com.ext.oauth.service.OAuthConfig;
-import egovframework.com.ext.oauth.service.OAuthLogin;
-import egovframework.com.ext.oauth.service.OAuthUniversalUser;
-import egovframework.com.ext.oauth.service.OAuthVO;
-import egovframework.com.utl.fcc.service.EgovStringUtil;
-
-/**
- * 소셜 계정으로 일반회원 가입을 처리하는 컨트롤러 클래스
- * @author 이기하
- * @since 2014.10.08
- * @version 1.0
- * @see
- *
- *
- * << 개정이력(Modification Information) >>
- *
- * 수정일 수정자 수정내용
- * ----------- -------- ---------------------------
- * 2014.10.08 이기하 최초 생성
- * 2018.10.02 신용호 Facebook 관련 ProviderSignInUtils 초기화 수정
- *
- */
-
-@Controller
-public class EgovSignupController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(EgovSignupController.class);
-
-
-// TODO 필요여부 확인할 것 DDDDDDDDDDDDDDDDDDDDDDDDD
-// @Resource(name="signupService")
-// private EgovSignupService signupService;
-
- //private ConnectionRepository connectionRepository;
- //private final ProviderSignInUtils providerSignInUtils;
- // TODO 필요여부 확인할 것 DDDDDDDDDDDDDDDDDDDDD
-
- @Inject
- private OAuthVO naverAuthVO;
-
- @Inject
- private OAuthVO googleAuthVO;
-
- @Inject
- private OAuthVO kakaoAuthVO;
-
-
-// TODO : 필요여부 확인할 것 DDDDDDDDDDDDDDDDDD
-// @Inject
-// public EgovSignupController(ConnectionFactoryLocator connectionFactoryLocator,UsersConnectionRepository connectionRepository) {
-// //this.providerSignInUtils = new ProviderSignInUtils();
-// this.providerSignInUtils = new ProviderSignInUtils(connectionFactoryLocator, connectionRepository);
-// }
-//
-// @RequestMapping(value="/signup", method=RequestMethod.GET)
-// public String signupForm(WebRequest request) throws Exception {
-// Connection> connection = providerSignInUtils.getConnectionFromSession(request);
-// if (connection != null) {
-// UserProfile profile = connection.fetchUserProfile();
-//
-// String key = EgovStringUtil.remove(connection.getKey().toString(), ':');
-// String account = signupService.signup(profile, request, key);
-// if (account != null) {
-// providerSignInUtils.doPostSignUp(key, request);
-// return "redirect:/";
-// }
-// }
-// return "redirect:/";
-// }
-
- @RequestMapping(value = "/uat/uia/oauthLoginUsr", method = RequestMethod.GET)
- public String login(Model model) throws Exception {
- LOGGER.debug("===>>> OAuth Login .....");
-
- OAuthLogin naverLogin = new OAuthLogin(naverAuthVO);
- LOGGER.debug("naverLogin.getOAuthURL() = "+naverLogin.getOAuthURL());
- model.addAttribute("naver_url", naverLogin.getOAuthURL());
-
- OAuthLogin googleLogin = new OAuthLogin(googleAuthVO);
- LOGGER.debug("googleLogin.getOAuthURL() = "+googleLogin.getOAuthURL());
- model.addAttribute("google_url", googleLogin.getOAuthURL());
-
- OAuthLogin kakaoLogin = new OAuthLogin(kakaoAuthVO);
- LOGGER.debug("kakaoLogin.getOAuthURL() = "+kakaoLogin.getOAuthURL());
- model.addAttribute("kakao_url", kakaoLogin.getOAuthURL());
-
- return "egovframework/com/uat/uia/EgovLoginUsrOauth";
- }
-
- @RequestMapping(value = "/auth/{oauthService}/callback",
- method = { RequestMethod.GET, RequestMethod.POST})
- public String oauthLoginCallback(@PathVariable String oauthService,
- Model model, @RequestParam String code, HttpSession session) throws Exception {
-
- LOGGER.debug("oauthLoginCallback: service={}", oauthService);
- LOGGER.debug("===>>> code = "+ code);
- OAuthVO oauthVO = null;
- if (StringUtils.equals(OAuthConfig.GOOGLE_SERVICE_NAME, oauthService))
- oauthVO = googleAuthVO;
- else if (StringUtils.equals(OAuthConfig.NAVER_SERVICE_NAME, oauthService))
- oauthVO = naverAuthVO;
- else
- oauthVO = kakaoAuthVO;
-
- // 1. code를 이용해서 Access Token 받기
- // 2. Access Token을 이용해서 사용자 제공정보 가져오기
- OAuthLogin oauthLogin = new OAuthLogin(oauthVO);
-
- OAuthUniversalUser oauthUser = oauthLogin.getUserProfile(code); // 1,2번 동시
- LOGGER.debug("Profile ===>>" + oauthUser);
-
- // ========================================================================
- // 다음 부분은 업무의 목적에 맞게 커스텀 코드를 작성한다.
- // 3. 해당 유저가 DB에 존재하는지 체크 (google, naver, kakao에서 전달받은 ID가 존재하는지 체크)
- String resultDBInfo = ""; // DB 체크 결과
-
- if ( oauthUser == null || resultDBInfo == null) {
- // 미존재시 가입페이지로!!
- model.addAttribute("message", "This user does not exist. Please sign up.");
-
- } else {
- // 존재시 로그인 처리
- model.addAttribute("message", "OAuth Sign-in succeeded.");
-
- }
-
- return "egovframework/com/uat/uia/EgovLoginUsrOauthResult";
- }
-
-}
diff --git a/src/main/java/nlib/bbs/web/BoardController.java b/src/main/java/nlib/bbs/web/BoardController.java
index 5855d1ad..b22375f6 100644
--- a/src/main/java/nlib/bbs/web/BoardController.java
+++ b/src/main/java/nlib/bbs/web/BoardController.java
@@ -634,7 +634,7 @@ public class BoardController extends NlibCommonController
//-------------------------------
// 비밀번호 : SHA-256 암호화 처리되어 DB에 저장되며,
// 웹 화면에 표출될 때는 Aria로 articleNo를 Salt값으로 하여 재암호화처리하고 BASE64로 다시 한번 인코딩하여 표출함
- String encArticlePassword = StringUtil.encodeBase64(ariaCrypto.encode(shaArticlePassword, articleNo));
+ String encArticlePassword = StringUtil.encodeBase64(ariaCrypto.encode(shaArticlePassword));
model.addAttribute("encArticlePassword", encArticlePassword);
// 검색 정보
@@ -680,7 +680,7 @@ public class BoardController extends NlibCommonController
// 비밀번호 : SHA-256 암호화 처리되어 DB에 저장되며,
// 웹 화면에 표출될 때는 Aria로 articleNo를 Salt값으로 하여 재암호화처리하고 BASE64로 다시 한번 인코딩하여 표출함
String encArticlePassword = paramMap.get("encArticlePassword");
- String checkArticlePassword = ariaCrypto.decode(StringUtil.decodeBase64(encArticlePassword), articleNo);
+ String checkArticlePassword = ariaCrypto.decode(StringUtil.decodeBase64(encArticlePassword));
String articlePassword = paramMap.get("articlePassword");
//-------------------------------
diff --git a/src/main/java/nlib/cmm/crypto/AriaCrypto.java b/src/main/java/nlib/cmm/crypto/AriaCrypto.java
index f31d8b19..2f2a3479 100644
--- a/src/main/java/nlib/cmm/crypto/AriaCrypto.java
+++ b/src/main/java/nlib/cmm/crypto/AriaCrypto.java
@@ -3,13 +3,11 @@ package nlib.cmm.crypto;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import egovframework.rte.fdl.cryptography.EgovPasswordEncoder;
import egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl;
import nlib.cmm.service.NlibProperty;
-import nlib.sample.web.SampleEncoderController;
import nlib.util.StringUtil;
/**
@@ -51,18 +49,40 @@ public class AriaCrypto {
* @return
*/
public static String encode(String value) {
- log.info("encode : 암호화에 사용할 키 정보가 없으므로 기본키 정보를 사용합니다 : " + ARIA_DEFAULT_KEY);
- return encode(value, ARIA_DEFAULT_KEY);
+
+ String ret = null;
+
+ try {
+ ret = AriaUtil.ariaEncrypt(value);
+ } catch(Exception e) {
+ log.error("ERROR at AriaCrypto.encode : " + e.toString());
+ e.printStackTrace();
+ ret = null;
+ }
+
+ return ret;
}
+ /**
+ * 기본키를 가지고 Egov 모듈을 사용하여 암호화한다.
+ *
+ * @param value
+ * @return
+ */
+ public static String encodeEgov(String value) {
+ log.info("encode : 암호화에 사용할 키 정보가 없으므로 기본키 정보를 사용합니다 : " + ARIA_DEFAULT_KEY);
+ return encodeEgov(value, ARIA_DEFAULT_KEY);
+ }
+
+
/**
- * 전달받은 key(사용자고유번호 혹은 메일주소 등 salt값)로 암호화한다.
+ * 전달받은 key(사용자고유번호 혹은 메일주소 등 salt값)로 Egov 모듈을 사용하여 암호화한다.
*
* @param value
* @param key
* @return
*/
- public static String encode(String value, String key) {
+ public static String encodeEgov(String value, String key) {
if(StringUtil.isEmpty(value)) {
log.error("encode : 암호화할 문자열 정보가 없습니다.");
@@ -94,17 +114,38 @@ public class AriaCrypto {
* @return
*/
public static String decode(String value) {
+
+ String ret = null;
+
+ try {
+ ret = AriaUtil.ariaDecrypt(value);
+ } catch(Exception e) {
+ log.error("ERROR at AriaCrypto.decode : " + e.toString());
+ e.printStackTrace();
+ ret = null;
+ }
+
+ return ret;
+ }
+
+ /**
+ * 기본키를 가지고 Egov 모듈을 사용하여 복호화한다.
+ *
+ * @param value
+ * @return
+ */
+ public static String decodeEgov(String value) {
log.info("decode : 복호화에 사용할 키 정보가 없으므로 기본키 정보를 사용합니다 : " + ARIA_DEFAULT_KEY);
- return decode(value, ARIA_DEFAULT_KEY);
+ return decodeEgov(value, ARIA_DEFAULT_KEY);
}
/**
- * 전달받은 key(사용자고유번호 혹은 메일주소 등 salt값)로 복호화한다.
+ * 전달받은 key(사용자고유번호 혹은 메일주소 등 salt값)로 Egov 모듈을 사용하여 복호화한다.
* @param value
* @param key
* @return
*/
- public static String decode(String value, String key) {
+ public static String decodeEgov(String value, String key) {
if(StringUtil.isEmpty(value)) {
log.error("decode : 복호화할 암호문자열 정보가 없습니다.");
diff --git a/src/main/java/nlib/cmm/crypto/AriaEngine.java b/src/main/java/nlib/cmm/crypto/AriaEngine.java
new file mode 100644
index 00000000..78bff06f
--- /dev/null
+++ b/src/main/java/nlib/cmm/crypto/AriaEngine.java
@@ -0,0 +1,590 @@
+//
+// ARIA.java
+//
+// A pure Java implementation of ARIA
+// following the official ARIA specification at
+//
+
+package nlib.cmm.crypto;
+
+import java.io.PrintStream;
+import java.security.InvalidKeyException;
+
+public class AriaEngine {
+
+ private static final char[] HEX_DIGITS = {
+ '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'
+ };
+
+ private static final int[][] KRK = {
+ {0x517cc1b7, 0x27220a94, 0xfe13abe8, 0xfa9a6ee0},
+ {0x6db14acc, 0x9e21c820, 0xff28b1d5, 0xef5de2b0},
+ {0xdb92371d, 0x2126e970, 0x03249775, 0x04e8c90e}
+ };
+
+ private static final byte[] S1 = new byte[256];
+ private static final byte[] S2 = new byte[256];
+ private static final byte[] X1 = new byte[256];
+ private static final byte[] X2 = new byte[256];
+
+ private static final int[] TS1 = new int[256];
+ private static final int[] TS2 = new int[256];
+ private static final int[] TX1 = new int[256];
+ private static final int[] TX2 = new int[256];
+
+ private String publicKey = "CREDIF_MASTERKEY";
+
+ private String privateKey = "";
+
+
+ // Static initializer. For setting up the tables
+ static {
+ int[] exp = new int[256];
+ int[] log = new int[256];
+ exp[0] = 1;
+ for (int i=1; i < 256; i++) {
+ int j = (exp[i-1] << 1) ^ exp[i-1];
+ if ((j & 0x100) != 0) j ^= 0x11b;
+ exp[i] = j;
+ }
+ for (int i=1; i < 255; i++)
+ log[exp[i]] = i;
+
+ int[][] A = {
+ {1, 0, 0, 0, 1, 1, 1, 1},
+ {1, 1, 0, 0, 0, 1, 1, 1},
+ {1, 1, 1, 0, 0, 0, 1, 1},
+ {1, 1, 1, 1, 0, 0, 0, 1},
+ {1, 1, 1, 1, 1, 0, 0, 0},
+ {0, 1, 1, 1, 1, 1, 0, 0},
+ {0, 0, 1, 1, 1, 1, 1, 0},
+ {0, 0, 0, 1, 1, 1, 1, 1}
+ };
+ int[][] B = {
+ {0, 1, 0, 1, 1, 1, 1, 0},
+ {0, 0, 1, 1, 1, 1, 0, 1},
+ {1, 1, 0, 1, 0, 1, 1, 1},
+ {1, 0, 0, 1, 1, 1, 0, 1},
+ {0, 0, 1, 0, 1, 1, 0, 0},
+ {1, 0, 0, 0, 0, 0, 0, 1},
+ {0, 1, 0, 1, 1, 1, 0, 1},
+ {1, 1, 0, 1, 0, 0, 1, 1}
+ };
+
+ for (int i=0; i<256; i++) {
+ int t=0, p;
+ if (i==0)
+ p=0;
+ else
+ p=exp[255-log[i]];
+ for (int j=0; j<8; j++) {
+ int s=0;
+ for (int k=0; k<8; k++) {
+ if (((p>>>(7-k))&0x01)!=0)
+ s^=A[k][j];
+ }
+ t=(t<<1)^s;
+ }
+ t^=0x63;
+ S1[i]=(byte)t;
+ X1[t]=(byte)i;
+ }
+ for (int i = 0; i < 256; i++) {
+ int t = 0, p;
+ if (i==0)
+ p=0;
+ else
+ p=exp[(247*log[i])%255];
+ for (int j = 0; j < 8; j++) {
+ int s = 0;
+ for (int k = 0; k < 8; k++) {
+ if (((p >>> k) & 0x01) != 0)
+ s ^= B[7-j][k];
+ }
+ t = (t << 1) ^ s;
+ }
+ t^=0xe2;
+ S2[i] = (byte) t;
+ X2[t] = (byte) i;
+ }
+
+ for (int i = 0; i < 256; i++) {
+ TS1[i]=0x00010101*(S1[i]&0xff);
+ TS2[i]=0x01000101*(S2[i]&0xff);
+ TX1[i]=0x01010001*(X1[i]&0xff);
+ TX2[i]=0x01010100*(X2[i]&0xff);
+ }
+ }
+
+ private int keySize=0;
+ private int numberOfRounds=0;
+ private byte[] masterKey=null;
+ private int[] encRoundKeys=null, decRoundKeys=null;
+
+ public AriaEngine(int keySize) throws InvalidKeyException {
+ setKeySize(keySize);
+ }
+
+ /**
+ * Resets the class so that it can be reused for another master key.
+ */
+ void reset() {
+ this.keySize=0;
+ this.numberOfRounds=0;
+ this.masterKey=null;
+ this.encRoundKeys=null;
+ this.decRoundKeys=null;
+ }
+
+ int getKeySize() {
+ return this.keySize;
+ }
+
+ void setKeySize(int keySize) throws InvalidKeyException {
+ this.reset();
+ if (keySize!=128 && keySize!=192 && keySize!=256)
+ throw new InvalidKeyException("keySize="+keySize);
+ this.keySize = keySize;
+ switch (keySize) {
+ case 128:
+ this.numberOfRounds = 12;
+ break;
+ case 192:
+ this.numberOfRounds = 14;
+ break;
+ case 256:
+ this.numberOfRounds = 16;
+ }
+ }
+
+ void setKey(byte[] masterKey) throws InvalidKeyException {
+ if (masterKey.length*8>>24)&0xff]^TS2[(t0>>>16)&0xff]^TX1[(t0>>>8)&0xff]^TX2[t0&0xff];
+ t1=TS1[(t1>>>24)&0xff]^TS2[(t1>>>16)&0xff]^TX1[(t1>>>8)&0xff]^TX2[t1&0xff];
+ t2=TS1[(t2>>>24)&0xff]^TS2[(t2>>>16)&0xff]^TX1[(t2>>>8)&0xff]^TX2[t2&0xff];
+ t3=TS1[(t3>>>24)&0xff]^TS2[(t3>>>16)&0xff]^TX1[(t3>>>8)&0xff]^TX2[t3&0xff];
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ t1=badc(t1); t2=cdab(t2); t3=dcba(t3);
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+
+ t0^=rk[j++]; t1^=rk[j++]; t2^=rk[j++]; t3^=rk[j++];
+ t0=TX1[(t0>>>24)&0xff]^TX2[(t0>>>16)&0xff]^TS1[(t0>>>8)&0xff]^TS2[t0&0xff];
+ t1=TX1[(t1>>>24)&0xff]^TX2[(t1>>>16)&0xff]^TS1[(t1>>>8)&0xff]^TS2[t1&0xff];
+ t2=TX1[(t2>>>24)&0xff]^TX2[(t2>>>16)&0xff]^TS1[(t2>>>8)&0xff]^TS2[t2&0xff];
+ t3=TX1[(t3>>>24)&0xff]^TX2[(t3>>>16)&0xff]^TS1[(t3>>>8)&0xff]^TS2[t3&0xff];
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ t3=badc(t3); t0=cdab(t0); t1=dcba(t1);
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ }
+ t0^=rk[j++]; t1^=rk[j++]; t2^=rk[j++]; t3^=rk[j++];
+ t0=TS1[(t0>>>24)&0xff]^TS2[(t0>>>16)&0xff]^TX1[(t0>>>8)&0xff]^TX2[t0&0xff];
+ t1=TS1[(t1>>>24)&0xff]^TS2[(t1>>>16)&0xff]^TX1[(t1>>>8)&0xff]^TX2[t1&0xff];
+ t2=TS1[(t2>>>24)&0xff]^TS2[(t2>>>16)&0xff]^TX1[(t2>>>8)&0xff]^TX2[t2&0xff];
+ t3=TS1[(t3>>>24)&0xff]^TS2[(t3>>>16)&0xff]^TX1[(t3>>>8)&0xff]^TX2[t3&0xff];
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ t1=badc(t1); t2=cdab(t2); t3=dcba(t3);
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+
+ t0^=rk[j++]; t1^=rk[j++]; t2^=rk[j++]; t3^=rk[j++];
+ o[ 0+ooffset] = (byte)(X1[0xff&(t0>>>24)] ^ (rk[j ]>>>24));
+ o[ 1+ooffset] = (byte)(X2[0xff&(t0>>>16)] ^ (rk[j ]>>>16));
+ o[ 2+ooffset] = (byte)(S1[0xff&(t0>>> 8)] ^ (rk[j ]>>> 8));
+ o[ 3+ooffset] = (byte)(S2[0xff&(t0 )] ^ (rk[j ] ));
+ o[ 4+ooffset] = (byte)(X1[0xff&(t1>>>24)] ^ (rk[j+1]>>>24));
+ o[ 5+ooffset] = (byte)(X2[0xff&(t1>>>16)] ^ (rk[j+1]>>>16));
+ o[ 6+ooffset] = (byte)(S1[0xff&(t1>>> 8)] ^ (rk[j+1]>>> 8));
+ o[ 7+ooffset] = (byte)(S2[0xff&(t1 )] ^ (rk[j+1] ));
+ o[ 8+ooffset] = (byte)(X1[0xff&(t2>>>24)] ^ (rk[j+2]>>>24));
+ o[ 9+ooffset] = (byte)(X2[0xff&(t2>>>16)] ^ (rk[j+2]>>>16));
+ o[10+ooffset] = (byte)(S1[0xff&(t2>>> 8)] ^ (rk[j+2]>>> 8));
+ o[11+ooffset] = (byte)(S2[0xff&(t2 )] ^ (rk[j+2] ));
+ o[12+ooffset] = (byte)(X1[0xff&(t3>>>24)] ^ (rk[j+3]>>>24));
+ o[13+ooffset] = (byte)(X2[0xff&(t3>>>16)] ^ (rk[j+3]>>>16));
+ o[14+ooffset] = (byte)(S1[0xff&(t3>>> 8)] ^ (rk[j+3]>>> 8));
+ o[15+ooffset] = (byte)(S2[0xff&(t3 )] ^ (rk[j+3] ));
+ }
+
+ void encrypt(byte[] i, int ioffset, byte[] o, int ooffset) throws InvalidKeyException {
+ if (this.keySize==0)
+ throw new InvalidKeyException("keySize");
+ if (this.encRoundKeys==null)
+ if (this.masterKey==null)
+ throw new InvalidKeyException("masterKey");
+ else
+ setupEncRoundKeys();
+ doCrypt(i, ioffset, this.encRoundKeys, this.numberOfRounds, o, ooffset);
+ }
+
+ byte[] encrypt(byte[] i, int ioffset) throws InvalidKeyException {
+ byte[] o = new byte[16];
+ this.encrypt(i, ioffset, o, 0);
+ return o;
+ }
+
+
+ public void decrypt(byte cipher[], byte plain[], int size)
+ throws InvalidKeyException {
+ int iLoop = size / 16;
+ int offset = 0;
+ for (int i = 0; i < iLoop; i++) {
+ decrypt(cipher, offset, plain, offset);
+ offset += 16;
+ }
+
+ }
+
+ void decrypt(byte[] i, int ioffset, byte[] o, int ooffset) throws InvalidKeyException {
+ if (this.keySize==0)
+ throw new InvalidKeyException("keySize");
+ if (this.decRoundKeys==null)
+ if (this.masterKey==null)
+ throw new InvalidKeyException("masterKey");
+ else
+ setupDecRoundKeys();
+ doCrypt(i, ioffset, this.decRoundKeys, this.numberOfRounds, o, ooffset);
+ }
+
+ byte[] decrypt(byte[] i, int ioffset) throws InvalidKeyException {
+ byte[] o = new byte[16];
+ this.decrypt(i, ioffset, o, 0);
+ return o;
+ }
+
+ private static void doEncKeySetup(byte[] mk, int[] rk, int keyBits) {
+ int t0, t1, t2, t3, q, j=0;
+ int[] w0 = new int[4];
+ int[] w1 = new int[4];
+ int[] w2 = new int[4];
+ int[] w3 = new int[4];
+
+ w0[0] = toInt(mk[ 0], mk[ 1], mk[ 2], mk[ 3]);
+ w0[1] = toInt(mk[ 4], mk[ 5], mk[ 6], mk[ 7]);
+ w0[2] = toInt(mk[ 8], mk[ 9], mk[10], mk[11]);
+ w0[3] = toInt(mk[12], mk[13], mk[14], mk[15]);
+
+ q = (keyBits - 128) / 64;
+ t0=w0[0]^KRK[q][0]; t1=w0[1]^KRK[q][1];
+ t2=w0[2]^KRK[q][2]; t3=w0[3]^KRK[q][3];
+ t0=TS1[(t0>>>24)&0xff]^TS2[(t0>>>16)&0xff]^TX1[(t0>>>8)&0xff]^TX2[t0&0xff];
+ t1=TS1[(t1>>>24)&0xff]^TS2[(t1>>>16)&0xff]^TX1[(t1>>>8)&0xff]^TX2[t1&0xff];
+ t2=TS1[(t2>>>24)&0xff]^TS2[(t2>>>16)&0xff]^TX1[(t2>>>8)&0xff]^TX2[t2&0xff];
+ t3=TS1[(t3>>>24)&0xff]^TS2[(t3>>>16)&0xff]^TX1[(t3>>>8)&0xff]^TX2[t3&0xff];
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ t1=badc(t1); t2=cdab(t2); t3=dcba(t3);
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+
+ if (keyBits > 128) {
+ w1[0] = toInt(mk[16], mk[17], mk[18], mk[19]);
+ w1[1] = toInt(mk[20], mk[21], mk[22], mk[23]);
+ if (keyBits > 192) {
+ w1[2] = toInt(mk[24], mk[25], mk[26], mk[27]);
+ w1[3] = toInt(mk[28], mk[29], mk[30], mk[31]);
+ } else {
+ w1[2]=w1[3]=0;
+ }
+ } else {
+ w1[0]=w1[1]=w1[2]=w1[3]=0;
+ }
+ w1[0]^=t0; w1[1]^=t1; w1[2]^=t2; w1[3]^=t3;
+ t0=w1[0]; t1=w1[1]; t2=w1[2]; t3=w1[3];
+
+ q = (q==2)? 0 : (q+1);
+ t0^=KRK[q][0]; t1^=KRK[q][1]; t2^=KRK[q][2]; t3^=KRK[q][3];
+ t0=TX1[(t0>>>24)&0xff]^TX2[(t0>>>16)&0xff]^TS1[(t0>>>8)&0xff]^TS2[t0&0xff];
+ t1=TX1[(t1>>>24)&0xff]^TX2[(t1>>>16)&0xff]^TS1[(t1>>>8)&0xff]^TS2[t1&0xff];
+ t2=TX1[(t2>>>24)&0xff]^TX2[(t2>>>16)&0xff]^TS1[(t2>>>8)&0xff]^TS2[t2&0xff];
+ t3=TX1[(t3>>>24)&0xff]^TX2[(t3>>>16)&0xff]^TS1[(t3>>>8)&0xff]^TS2[t3&0xff];
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ t3=badc(t3); t0=cdab(t0); t1=dcba(t1);
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ t0^=w0[0]; t1^=w0[1]; t2^=w0[2]; t3^=w0[3];
+ w2[0]=t0; w2[1]=t1; w2[2]=t2; w2[3]=t3;
+
+ q = (q==2)? 0 : (q+1);
+ t0^=KRK[q][0]; t1^=KRK[q][1]; t2^=KRK[q][2]; t3^=KRK[q][3];
+ t0=TS1[(t0>>>24)&0xff]^TS2[(t0>>>16)&0xff]^TX1[(t0>>>8)&0xff]^TX2[t0&0xff];
+ t1=TS1[(t1>>>24)&0xff]^TS2[(t1>>>16)&0xff]^TX1[(t1>>>8)&0xff]^TX2[t1&0xff];
+ t2=TS1[(t2>>>24)&0xff]^TS2[(t2>>>16)&0xff]^TX1[(t2>>>8)&0xff]^TX2[t2&0xff];
+ t3=TS1[(t3>>>24)&0xff]^TS2[(t3>>>16)&0xff]^TX1[(t3>>>8)&0xff]^TX2[t3&0xff];
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ t1=badc(t1); t2=cdab(t2); t3=dcba(t3);
+ t1^=t2; t2^=t3; t0^=t1; t3^=t1; t2^=t0; t1^=t2;
+ w3[0]=t0^w1[0]; w3[1]=t1^w1[1]; w3[2]=t2^w1[2]; w3[3]=t3^w1[3];
+
+ gsrk(w0, w1, 19, rk, j); j+=4;
+ gsrk(w1, w2, 19, rk, j); j+=4;
+ gsrk(w2, w3, 19, rk, j); j+=4;
+ gsrk(w3, w0, 19, rk, j); j+=4;
+ gsrk(w0, w1, 31, rk, j); j+=4;
+ gsrk(w1, w2, 31, rk, j); j+=4;
+ gsrk(w2, w3, 31, rk, j); j+=4;
+ gsrk(w3, w0, 31, rk, j); j+=4;
+ gsrk(w0, w1, 67, rk, j); j+=4;
+ gsrk(w1, w2, 67, rk, j); j+=4;
+ gsrk(w2, w3, 67, rk, j); j+=4;
+ gsrk(w3, w0, 67, rk, j); j+=4;
+ gsrk(w0, w1, 97, rk, j); j+=4;
+ if (keyBits > 128) {
+ gsrk(w1, w2, 97, rk, j); j+=4;
+ gsrk(w2, w3, 97, rk, j); j+=4;
+ }
+ if (keyBits > 192) {
+ gsrk(w3, w0, 97, rk, j); j+=4;
+ gsrk(w0, w1, 109, rk, j);
+ }
+ }
+
+ /**
+ * Main bulk of the decryption key setup method. Here we assume that
+ * the int array rk already contains the encryption round keys.
+ * @param mk the master key
+ * @param rk the array which contains the encryption round keys at the
+ * beginning of the method execution. At the end of method execution
+ * this will hold the decryption round keys.
+ * @param keyBits the length of the master key
+ * @return
+ */
+ private static void doDecKeySetup(byte[] mk, int[] rk, int keyBits) {
+ int a=0, z;
+ int[] t = new int[4];
+
+ z=32+keyBits/8;
+ swapBlocks(rk, 0, z);
+ a+=4; z-=4;
+
+ for (; a>>24);
+ b[offset+1] = (byte)(i>>>16);
+ b[offset+2] = (byte)(i>>> 8);
+ b[offset+3] = (byte)(i );
+ }
+
+ private static int m(int t) {
+ return 0x00010101*((t>>>24)&0xff) ^ 0x01000101*((t>>>16)&0xff) ^
+ 0x01010001*((t>>>8)&0xff) ^ 0x01010100*(t&0xff);
+ }
+
+ private static final int badc(int t) {
+ return ((t<<8)&0xff00ff00) ^ ((t>>>8)&0x00ff00ff);
+ }
+
+ private static final int cdab(int t) {
+ return ((t<<16)&0xffff0000) ^ ((t>>>16)&0x0000ffff);
+ }
+
+ private static final int dcba(int t) {
+ return (t&0x000000ff)<<24 ^ (t&0x0000ff00)<<8 ^ (t&0x00ff0000)>>>8 ^ (t&0xff000000)>>>24;
+ }
+
+ private static final void gsrk(int[] x, int[] y, int rot, int[] rk, int offset) {
+ int q=4-(rot/32), r=rot%32, s=32-r;
+
+ rk[offset] = x[0] ^ y[(q )%4]>>>r ^ y[(q+3)%4]<>>r ^ y[(q )%4]<>>r ^ y[(q+1)%4]<>>r ^ y[(q+2)%4]<>> 4) & 0x0F],
+ HEX_DIGITS[ b & 0x0F]
+ };
+ out.print(new String(buf));
+ }
+
+ private static void intToHex(PrintStream out, int i) {
+ byte[] b = new byte[4];
+ toByteArray(i, b, 0);
+ byteToHex(out, b[0]);
+ byteToHex(out, b[1]);
+ byteToHex(out, b[2]);
+ byteToHex(out, b[3]);
+ }
+
+ private static void printRoundKeys(PrintStream out, int[] roundKeys) {
+ for (int i=0; i= iLoop - 1)
+ if (iMod == 0)
+ iCopySize = 16;
+ else
+ iCopySize = iMod;
+ for (int j = 0; j < 16; j++)
+ in[j] = 0;
+
+ System.arraycopy(plain, offset, in, 0, iCopySize);
+ encrypt(in, 0, cipher, offset);
+ offset += iCopySize;
+ }
+
+ }
+ /* hex to byte[] convert */
+ public static byte[] hexToByteArray(String hex) {
+ if (hex == null || hex.length() == 0) {
+ return null;
+ }
+
+ byte[] ba = new byte[hex.length() / 2];
+ for (int i = 0; i < ba.length; i++) {
+ ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
+ }
+ return ba;
+ }
+
+
+
+ /* byte to hexa convert */
+ public static String byteArrayToHex(byte[] ba) {
+ if (ba == null || ba.length == 0) {
+ return null;
+ }
+
+ StringBuffer sb = new StringBuffer(ba.length * 2);
+ String hexNumber;
+ for (int x = 0; x < ba.length; x++) {
+ hexNumber = "0" + Integer.toHexString(0xff & ba[x]);
+
+ sb.append(hexNumber.substring(hexNumber.length() - 2));
+ }
+ return sb.toString();
+ }
+
+ public AriaEngine(int keySize, String privateKey)throws InvalidKeyException {
+
+ this.keySize = 0;
+ numberOfRounds = 0;
+ masterKey = null;
+ encRoundKeys = null;
+ decRoundKeys = null;
+ setKeySize(keySize);
+
+ byte[] mk = new byte[32];
+ this.privateKey = privateKey;
+ byte[] p1Key = this.publicKey.getBytes();
+ System.arraycopy(p1Key, 0, mk, 0, p1Key.length);
+ this.setKey(mk);
+ this.setupRoundKeys();
+
+ byte[] p2Key = new byte[32];
+ byte[] mk2 = new byte[32];
+ byte[] privateKeyByte = privateKey.getBytes();
+ if (privateKeyByte.length > 32) {
+ System.arraycopy(privateKeyByte, 0, mk2, 0, 32);
+ } else {
+ System.arraycopy(privateKeyByte, 0, mk2, 0, privateKeyByte.length);
+ }
+ byte[] makeKey = new byte[32];
+ this.encrypt(mk2, makeKey, mk2.length);
+ this.setKey(makeKey);
+ this.setupRoundKeys();
+
+
+ }
+ public static void main(String[] args) throws InvalidKeyException {
+
+ }
+}
diff --git a/src/main/java/nlib/cmm/crypto/AriaUtil.java b/src/main/java/nlib/cmm/crypto/AriaUtil.java
new file mode 100644
index 00000000..01783094
--- /dev/null
+++ b/src/main/java/nlib/cmm/crypto/AriaUtil.java
@@ -0,0 +1,355 @@
+/**
+ * 전자정부 제공 ARIAUTIL
+ * ARIAUtil
+ */
+
+package nlib.cmm.crypto;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+
+import nlib.cmm.service.NlibProperty;
+
+public class AriaUtil {
+
+ public static final String PRIVATE_KEY = NlibProperty.getProperty("crypto.aria.defaultKey");
+
+ public static String ariaEncrypt(String str, String privateKey)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ if (str==null || str.equals("")) return "";
+
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+ p = new byte[str.getBytes().length];
+ p = str.getBytes();
+
+ int len = str.getBytes().length;
+ if ((len % 16) != 0) {
+ len = (len / 16 + 1) * 16;
+ }
+ c = new byte[len];
+ System.arraycopy(p, 0, c, 0, p.length);
+ instance.encrypt(p, c, p.length);
+
+ return AriaEngine.byteArrayToHex(c).toUpperCase();
+ }
+
+ /**
+ * @param privateKey
+ * @param src
+ * @param dest
+ * @throws IOException
+ * @throws InvalidKeyException
+ * @throws UnsupportedEncodingException
+ */
+ public static void ariaFileEncrypt(String privateKey, String src, String dest)
+ throws IOException, InvalidKeyException, UnsupportedEncodingException {
+ File f = new File(src);
+ FileInputStream fis = new FileInputStream(src);
+
+ long length = f.length();
+ byte[] b = new byte[(int)length];
+
+ try {
+ int offset = 0;
+ int numRead = 0;
+ while (offset < b.length && (numRead=fis.read(b, offset, b.length-offset)) >= 0) {
+ offset += numRead;
+ }
+ if (offset < b.length) {
+ throw new IOException(f.getName());
+ }
+ } finally{
+ fis.close();
+ }
+
+ AriaEngine instance = new AriaEngine(256, privateKey);
+ int len = b.length;
+ if ((len % 16) != 0) {
+ len = (len / 16 + 1) * 16;
+ }
+ byte[] c = new byte[len];
+ System.arraycopy(b, 0, c, 0, b.length);
+ instance.encrypt(b, c, b.length);
+ FileOutputStream fos = new FileOutputStream(dest);
+ try {
+ fos.write(c);
+ } catch (IOException e) {
+
+ } finally {
+ try {
+ fos.close();
+ } catch (IOException e) {}
+ }
+ }
+
+ /*
+ *Aria 복호화
+ */
+ public static String ariaDecrypt(String strHex, String privateKey)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ if (strHex==null || strHex.equals("")) return "";
+
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+
+ c = AriaEngine.hexToByteArray(strHex);
+ p = new byte[c.length];
+ instance.decrypt(c, p, p.length);
+
+ StringBuffer buf = new StringBuffer();
+ buf.append(new String(p));
+
+ return buf.toString().trim();
+ }
+
+
+ public static void ariaFileDecrypt(String privateKey, String src, String dest)
+ throws IOException, InvalidKeyException, UnsupportedEncodingException {
+ File f = new File(src);
+ FileInputStream fis = new FileInputStream(src);
+
+ long length = f.length();
+ byte[] b = new byte[(int)length];
+
+ try {
+ int offset = 0;
+ int numRead = 0;
+ while (offset < b.length && (numRead=fis.read(b, offset, b.length-offset)) >= 0) {
+ offset += numRead;
+ }
+ if (offset < b.length) {
+ throw new IOException(f.getName());
+ }
+ } finally{
+ fis.close();
+ }
+
+ AriaEngine instance = new AriaEngine(256, privateKey);
+ int len = b.length;
+ if ((len % 16) != 0) {
+ len = (len / 16 + 1) * 16;
+ }
+ byte[] c = new byte[len];
+ System.arraycopy(b, 0, c, 0, b.length);
+ instance.decrypt(b, c, b.length);
+
+ FileOutputStream fos = new FileOutputStream(dest);
+ try {
+ fos.write(c);
+ } catch (IOException e) {
+
+ } finally {
+ try {
+ fos.close();
+ } catch (IOException e) {}
+ }
+ }
+
+ private static String makeMasterKey(String str) {
+ String appendStr = "Naravision KebiPortal Solution";
+ StringBuffer buf = new StringBuffer();
+ buf.append(str).append(appendStr);
+
+ return buf.substring(0,32);
+ }
+
+
+ /*
+ *Aria 기본 복호화
+ */
+ public static String ariaDecrypt(String strHex)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ String originalData = strHex;
+ if (strHex==null || strHex.equals("")) return "";
+ StringBuffer buf = null;
+ try {
+ String privateKey = PRIVATE_KEY;
+
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+
+ c = hexToByteArray(strHex);
+ p = new byte[c.length];
+ instance.decrypt(c, p, p.length);
+
+ buf = new StringBuffer();
+ buf.append(new String(p));
+ return buf.toString().trim();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return originalData;
+ }
+ }
+ /*
+ *aria 기본 암호화
+ */
+ public static String ariaEncrypt(String str)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ if (str==null || str.equals("")) return "";
+ String privateKey = PRIVATE_KEY;
+
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+ p = new byte[str.getBytes().length];
+ p = str.getBytes();
+
+ int len = str.getBytes().length;
+ if ((len % 16) != 0) {
+ len = (len / 16 + 1) * 16;
+ }
+ c = new byte[len];
+ System.arraycopy(p, 0, c, 0, p.length);
+ instance.encrypt(p, c, p.length);
+
+ return byteArrayToHex(c).toUpperCase();
+ }
+
+ /*
+ *캐릭터셋 변경 암호화
+ */
+ public static String ariaCharEncrypt(String str, String charset)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ if (str==null || str.equals("")) return "";
+ String privateKey = PRIVATE_KEY;
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+ p = new byte[str.getBytes(charset).length];
+ p = str.getBytes(charset);
+ int len = str.getBytes(charset).length;
+ if ((len % 16) != 0) {
+ len = (len / 16 + 1) * 16;
+ }
+ c = new byte[len];
+ System.arraycopy(p, 0, c, 0, p.length);
+ instance.encrypt(p, c, p.length);
+
+ return byteArrayToHex(c).toUpperCase();
+ }
+
+ /*
+ *캐릭터셋 변경 암호화
+ *(서버타입설정 열람서버 : read, 등록관리서버 : regi)
+ */
+ public static String ariaCharEncrypt(String str, String charset, String server)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ if (str==null || str.equals("")) return "";
+ String privateKey = "";
+ if(server.equals("regi")) privateKey = PRIVATE_KEY;
+ else privateKey = PRIVATE_KEY;
+
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+ p = new byte[str.getBytes(charset).length];
+ p = str.getBytes(charset);
+ int len = str.getBytes(charset).length;
+ if ((len % 16) != 0) {
+ len = (len / 16 + 1) * 16;
+ }
+ c = new byte[len];
+ System.arraycopy(p, 0, c, 0, p.length);
+ instance.encrypt(p, c, p.length);
+
+ return byteArrayToHex(c).toUpperCase();
+ }
+
+
+
+ /*
+ *Aria 캐릭터셋 변경 복호화
+ */
+ public static String ariaCharDecrypt(String strHex, String charset)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ if (strHex==null || strHex.equals("")) return "";
+ String privateKey = PRIVATE_KEY;
+
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+
+ c = hexToByteArray(strHex);
+ p = new byte[c.length];
+ instance.decrypt(c, p, p.length);
+
+ StringBuffer buf = new StringBuffer();
+ buf.append(new String(p,charset));
+
+ return buf.toString().trim();
+ }
+
+ /*
+ *Aria 캐릭터셋 변경 복호화
+ *(서버타입설정 열람서버 : read, 등록관리서버 : regi)
+ */
+ public static String ariaCharDecrypt(String strHex, String charset, String server)
+ throws InvalidKeyException, UnsupportedEncodingException {
+ if (strHex==null || strHex.equals("")) return "";
+ String privateKey = "";
+ if(server.equals("regi")) privateKey = PRIVATE_KEY;
+ else privateKey = PRIVATE_KEY;
+
+ byte[] p;
+ byte[] c;
+ AriaEngine instance = new AriaEngine(256, privateKey);
+
+ c = hexToByteArray(strHex);
+ p = new byte[c.length];
+ instance.decrypt(c, p, p.length);
+
+ StringBuffer buf = new StringBuffer();
+ buf.append(new String(p,charset));
+
+ return buf.toString().trim();
+ }
+
+ // hex to byte[]
+ public static byte[] hexToByteArray(String hex) {
+ if (hex == null || hex.length() == 0) {
+ return null;
+ }
+
+ byte[] ba = new byte[hex.length() / 2];
+
+ try {
+
+ for (int i = 0; i < ba.length; i++) {
+ ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
+ }
+
+ }catch(NumberFormatException e){
+ //
+ }catch(Exception e) {
+ //
+ }
+
+
+ return ba;
+ }
+
+ // byte[] to hex
+ public static String byteArrayToHex(byte[] ba) {
+ if (ba == null || ba.length == 0) {
+ return null;
+ }
+
+ StringBuffer sb = new StringBuffer(ba.length * 2);
+ String hexNumber;
+ for (int x = 0; x < ba.length; x++) {
+ hexNumber = "0" + Integer.toHexString(0xff & ba[x]);
+
+ sb.append(hexNumber.substring(hexNumber.length() - 2));
+ }
+ return sb.toString();
+
+ }
+}
diff --git a/src/main/java/nlib/cmm/snslogin/NaverLoginBO.java b/src/main/java/nlib/cmm/snslogin/NaverLoginBO.java
deleted file mode 100644
index 126ab0d9..00000000
--- a/src/main/java/nlib/cmm/snslogin/NaverLoginBO.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package nlib.cmm.snslogin;
-
-import java.io.IOException;
-import java.util.UUID;
-
-import javax.servlet.http.HttpSession;
-
-import org.springframework.util.StringUtils;
-
-import com.github.scribejava.core.builder.ServiceBuilder;
-import com.github.scribejava.core.model.OAuth2AccessToken;
-import com.github.scribejava.core.model.OAuthRequest;
-import com.github.scribejava.core.model.Response;
-import com.github.scribejava.core.model.Verb;
-import com.github.scribejava.core.oauth.OAuth20Service;
-
-public class NaverLoginBO {
-
- /* 인증 요청문을 구성하는 파라미터 */
- //client_id: 애플리케이션 등록 후 발급받은 클라이언트 아이디
- //response_type: 인증 과정에 대한 구분값. code로 값이 고정돼 있습니다.
- //redirect_uri: 네이버 로그인 인증의 결과를 전달받을 콜백 URL(URL 인코딩). 애플리케이션을 등록할 때 Callback URL에 설정한 정보입니다.
- //state: 애플리케이션이 생성한 상태 토큰
- private final static String CLIENT_ID = "jefkoYhSfrQ3TtZz5mTp";
- private final static String CLIENT_SECRET = "E2qAGaLEaG";
- private static String REDIRECT_URI = "";
- private final static String SESSION_STATE = "oauth_state";
- /* 프로필 조회 API URL */
- private final static String PROFILE_API_URL = "https://openapi.naver.com/v1/nid/me";
-
- public void setRedirect_url(String REDIRECT_URI) {
- this.REDIRECT_URI = REDIRECT_URI;
- }
- /* 네이버 아이디로 인증 URL 생성 Method */
- public String getAuthorizationUrl(HttpSession session) {
-
- /* 세션 유효성 검증을 위하여 난수를 생성 */
- String state = generateRandomString();
- /* 생성한 난수 값을 session에 저장 */
- setSession(session,state);
- System.out.println(getSession(session));
-
- /* Scribe에서 제공하는 인증 URL 생성 기능을 이용하여 네아로 인증 URL 생성 */
- OAuth20Service oauthService = new ServiceBuilder()
- .apiKey(CLIENT_ID)
- .apiSecret(CLIENT_SECRET)
- .callback(REDIRECT_URI)
- .state(state) //앞서 생성한 난수값을 인증 URL생성시 사용함
- .build(NaverLoginApi.instance());
-
- return oauthService.getAuthorizationUrl();
- }
- /* 네이버아이디로 Callback 처리 및 AccessToken 획득 Method */
- public OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException{
-
- /* Callback으로 전달받은 세선검증용 난수값과 세션에 저장되어있는 값이 일치하는지 확인 */
- String sessionState = getSession(session);
- if(StringUtils.pathEquals(sessionState, state)){
-
- OAuth20Service oauthService = new ServiceBuilder()
- .apiKey(CLIENT_ID)
- .apiSecret(CLIENT_SECRET)
- .callback(REDIRECT_URI)
- .state(state)
- .build(NaverLoginApi.instance());
-
- /* Scribe에서 제공하는 AccessToken 획득 기능으로 네아로 Access Token을 획득 */
- OAuth2AccessToken accessToken = oauthService.getAccessToken(code);
- return accessToken;
- }
- return null;
- }
-
- /* 세션 유효성 검증을 위한 난수 생성기 */
- private String generateRandomString() {
- return UUID.randomUUID().toString();
- }
-
- /* http session에 데이터 저장 */
- private void setSession(HttpSession session,String state){
- session.setAttribute(SESSION_STATE, state);
- }
-
- /* http session에서 데이터 가져오기 */
- private String getSession(HttpSession session){
- return (String) session.getAttribute(SESSION_STATE);
- }
- /* Access Token을 이용하여 네이버 사용자 프로필 API를 호출 */
- public String getUserProfile(OAuth2AccessToken oauthToken) throws IOException{
-
- OAuth20Service oauthService =new ServiceBuilder()
- .apiKey(CLIENT_ID)
- .apiSecret(CLIENT_SECRET)
- .callback(REDIRECT_URI).build(NaverLoginApi.instance());
-
- OAuthRequest request = new OAuthRequest(Verb.GET, PROFILE_API_URL, oauthService);
- oauthService.signRequest(oauthToken, request);
- Response response = request.send();
- return response.getBody();
- }
-
-}
diff --git a/src/main/java/nlib/sample/web/SampleEncoderController.java b/src/main/java/nlib/sample/web/SampleEncoderController.java
index fcfee737..1cb41074 100644
--- a/src/main/java/nlib/sample/web/SampleEncoderController.java
+++ b/src/main/java/nlib/sample/web/SampleEncoderController.java
@@ -14,6 +14,7 @@ import egovframework.rte.fdl.cryptography.EgovEnvCryptoService;
import egovframework.rte.fdl.cryptography.EgovPasswordEncoder;
import egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl;
import nlib.cmm.crypto.AriaCrypto;
+import nlib.cmm.service.NlibProperty;
import nlib.util.StringUtil;
/**
@@ -61,46 +62,49 @@ public class SampleEncoderController {
public String getSampleInfoForm(ModelMap model
, @RequestParam(required=false) String hash
, @RequestParam(required=false) String plainText
- , @RequestParam(required=false) String key
+ , @RequestParam(required=false) String encodedText
) throws Exception {
String msg = null;
- String encodedText = null;
String decodedText = null;
if(StringUtil.isEmpty(hash)) {
msg = "암호화 알고리즘을 선택하여 주시기 바랍니다.";
- } else if(StringUtil.isEmpty(plainText)) {
- msg = "암호화할 문자열을 입력하여 주시기 바랍니다.";
- } else {
-
+ } else if(StringUtil.isNotEmpty(plainText)) {
+ // 암호처리
log.debug("암호화 처리 시작 =" + plainText + "=");
- if("sha-256".equals(hash)) {
+ if("sha-256".equalsIgnoreCase(hash)) {
encodedText = egovPasswordEncoder.encryptPassword(plainText);
} else if("aria".equals(hash)) {
- if(StringUtil.isEmpty(key)) encodedText = ariaCrypto.encode(plainText);
- else encodedText = ariaCrypto.encode(plainText, key);
+ encodedText = ariaCrypto.encode(plainText);
log.debug(" Aria plainText=" + plainText);
log.debug(" Aria encodedText=" + encodedText);
- if(StringUtil.isEmpty(key)) decodedText = ariaCrypto.decode(encodedText);
- else decodedText = ariaCrypto.decode(encodedText, key);
-
+ decodedText = ariaCrypto.decode(encodedText);
log.debug(" Aria after decoding, decodedText=" + decodedText);
+
} else {
msg = "암호화 알고리즘이 적합하지 않습니다.";
}
+ } else if("aria".equalsIgnoreCase(hash) && StringUtil.isNotEmpty(encodedText)) {
+ // 복호처리
+ decodedText = ariaCrypto.decode(encodedText);
+ log.debug(" Aria after decoding, decodedText=" + decodedText);
+
+ } else {
+ msg = "암호화할 문자열을 입력하여 주시기 바랍니다.";
}
+
model.addAttribute("msg", msg);
- model.addAttribute("hash", hash);
+ model.addAttribute("hash", StringUtil.getString(hash, "aria"));
model.addAttribute("plainText", plainText);
model.addAttribute("encodedText", encodedText);
model.addAttribute("decodedText", decodedText);
- model.addAttribute("key", key);
+ model.addAttribute("key", NlibProperty.getProperty("crypto.aria.defaultKey"));
return "nlib/sample/getSampleEncoder";
}
diff --git a/src/main/java/nlib/user/service/impl/LoginDAO.java b/src/main/java/nlib/user/service/impl/LoginDAO.java
index b504392a..6cd71b34 100644
--- a/src/main/java/nlib/user/service/impl/LoginDAO.java
+++ b/src/main/java/nlib/user/service/impl/LoginDAO.java
@@ -6,6 +6,7 @@ import java.util.HashMap;
import org.springframework.stereotype.Repository;
import egovframework.com.cmm.service.impl.EgovComAbstractDAO;
+import nlib.cmm.crypto.AriaCrypto;
import nlib.restful.service.DataApiReqVO;
import nlib.restful.service.DataApiResVO;
import nlib.user.service.NlibLoginVO;
@@ -22,7 +23,19 @@ public class LoginDAO extends EgovComAbstractDAO {
}
public NlibLoginVO selectLoginUserInfo(NlibLoginVO nLoginParamVO) {
- return (NlibLoginVO) selectOne("LoginDAO.selectLoginUserInfo", nLoginParamVO);
+
+ NlibLoginVO nlibLoginVO = selectOne("LoginDAO.selectLoginUserInfo", nLoginParamVO);
+
+ // 개인정보 암호화 내용 복호화 처리
+ if(nlibLoginVO != null) {
+ nlibLoginVO.setMobileNo(AriaCrypto.decode(nlibLoginVO.getMobileNo()));
+ nlibLoginVO.setEmail(AriaCrypto.decode(nlibLoginVO.getEmail()));
+ nlibLoginVO.setZipCode(AriaCrypto.decode(nlibLoginVO.getZipCode()));
+ nlibLoginVO.setAddress(AriaCrypto.decode(nlibLoginVO.getAddress()));
+ nlibLoginVO.setAddressDetail(AriaCrypto.decode(nlibLoginVO.getAddressDetail()));
+ nlibLoginVO.setBirthday(AriaCrypto.decode(nlibLoginVO.getBirthday()));
+ }
+ return (NlibLoginVO) nlibLoginVO;
}
public void insertLoginLog(NlibLoginVO userVO) {
diff --git a/src/main/java/nlib/user/web/MemberController.java b/src/main/java/nlib/user/web/MemberController.java
index 5f14cb52..8b76635c 100644
--- a/src/main/java/nlib/user/web/MemberController.java
+++ b/src/main/java/nlib/user/web/MemberController.java
@@ -63,7 +63,6 @@ import nlib.cmm.service.NlibProperty;
import nlib.cmm.session.SessionConfig;
import nlib.cmm.snslogin.GoogleOAuthResponse;
import nlib.cmm.snslogin.KakaoController;
-import nlib.cmm.snslogin.NaverLoginBO;
import nlib.info.service.InformService;
import nlib.mail.EmailSender;
import nlib.mail.service.EmailVO;
@@ -126,15 +125,6 @@ public class MemberController {
@Resource(name = "egovEnvPasswordEncoderService")
EgovPasswordEncoder egovPasswordEncoder;
- /* NaverLoginBO */
- private NaverLoginBO naverLoginBO;
- private String apiResult = null;
-
- @Autowired
- private void setNaverLoginBO(NaverLoginBO naverLoginBO) {
- this.naverLoginBO = naverLoginBO;
- }
-
@Autowired
private EmailSender emailSender;
diff --git a/src/main/resources/egovframework/spring/context-common.xml b/src/main/resources/egovframework/spring/context-common.xml
index a20eb93d..cc683c40 100644
--- a/src/main/resources/egovframework/spring/context-common.xml
+++ b/src/main/resources/egovframework/spring/context-common.xml
@@ -65,8 +65,6 @@
-
-
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
index 0c391df1..ecee2104 100644
--- a/src/main/resources/log4j2.xml
+++ b/src/main/resources/log4j2.xml
@@ -29,7 +29,7 @@
-
+
diff --git a/src/main/webapp/WEB-INF/jsp/nlib/sample/getSampleEncoder.jsp b/src/main/webapp/WEB-INF/jsp/nlib/sample/getSampleEncoder.jsp
index abaecdd9..86fa916f 100644
--- a/src/main/webapp/WEB-INF/jsp/nlib/sample/getSampleEncoder.jsp
+++ b/src/main/webapp/WEB-INF/jsp/nlib/sample/getSampleEncoder.jsp
@@ -55,16 +55,15 @@
${pageTitle}
msg : ${msg}
hash : ("sha-256" 또는 "aria" 입력)
+ key : ${key} (hash 알고리즘이 aria인 경우)
plainText :
encodedText :
- decodedText :
- key : (hash 알고리즘이 aria인 경우 입력 필수)
-
+ decodedText : ${decodedText}
-
+
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 29244d90..a2bb363e 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,8 +1,10 @@
-
+
+
nlib