작업 환경
eGovFramework Version : 3.8
Eclipse Version : Oxygen.3a Release (4.7.3a)
JDK Version : 1.8
1. 비밀번호 암호화 분석
단방향 암호화는 비밀번호와 같이 평문을 암호문으로 변경 가능 하지만 다시 평문으로 복호화를 할 수 없도록 하는 암호 알고리즘 입니다. 간략하게 소스를 살펴 보도록 하겠습니다.
로그인을 하게 되면 아이디와 비밀번호를 이용하여 로그인 처리를 하게 되는데 처리하는 모듈은 다음과 같습니다.
/CopyCoding/src/main/java/egovframework/com/uat/uia/service/impl/EgovLoginServiceImpl.java
@Override public LoginVO actionLogin(LoginVO vo) throws Exception {
// 1. 입력한 비밀번호를 암호화한다. String enpassword = EgovFileScrty.encryptPassword(vo.getPassword(), vo.getId()); vo.setPassword(enpassword);
// 2. 아이디와 암호화된 비밀번호가 DB와 일치하는지 확인한다. LoginVO loginVO = loginDAO.actionLogin(vo);
// 3. 결과를 리턴한다. if (loginVO != null && !loginVO.getId().equals("") && !loginVO.getPassword().equals("")) { return loginVO; } else { loginVO = new LoginVO(); }
return loginVO; } |
소스에 있는 설명처럼 1번에서 비밀번호를 암호화 해서 enpassword에 받아오고 받아온 암호문을 2번에서 DB에 저장된 암호문과 비교를 하면 됩니다.
그럼 실제로 비밀번호를 암호화 하는 함수를 살펴보면
/common/src/main/java/egovframework/com/utl/sim/service/EgovFileScrty.java
/** * 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용) * * @param password 암호화될 패스워드 * @param id salt로 사용될 사용자 ID 지정 * @return * @throws Exception */ public static String encryptPassword(String password, String id) throws Exception {
if (password == null) return ""; if (id == null) return ""; // KISA 보안약점 조치
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset(); md.update(id.getBytes());
hashValue = md.digest(password.getBytes());
return new String(Base64.encodeBase64(hashValue)); } |
id도 키 값으로 사용하여 암호화를 진행하고 리턴 해주고 있습니다.
2. 단방향 암호화 사용
비밀번호를 암호화 하는 모듈을 살펴보니 참 간단 합니다. 이제 이것을 이용하여 단방향 암호화 기능을 만들어 보겠습니다.
우선 Service를 적당히 만들어... 아니 그냥 써도 되고 대충 service class를 만들고 기존 소스를 복사해서 사용해도 됩니다.
저는 class를 만들어서 사용해 보았습니다.
내용은 기존 소스를 복사했고요.
public class CryptoOnewayPasswd {
/** * 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용) * * @param password 암호화될 패스워드 * @param id salt로 사용될 사용자 ID 지정 * @return * @throws Exception */ public static String encryptPassword(String password, String id) throws Exception {
if (password == null) return ""; if (id == null) return ""; // KISA 보안약점 조치
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset(); md.update(id.getBytes());
hashValue = md.digest(password.getBytes());
return new String(Base64.encodeBase64(hashValue)); } } |
이제 서비스를 호출할 Controller를 하나 작성 합니다.
Controller 내용도 별거 없고 모듈에 아이디와 비밀번호를 넘겨주고 암호화된 비밀번호를 받으면 됩니다.
@Controller public class CryptoOnewayPasswdController { private static final Logger LOGGER = LoggerFactory.getLogger(CryptoOnewayPasswdController.class);
@Resource(name = "cryptoOnewayPasswd") private CryptoOnewayPasswd cryptoOnewayPasswd;
@RequestMapping("/copycoding/cryptoOnewayPasswd.do") public String cryptoPasswd(ModelMap model) throws Exception {
String id= "copycoding"; String password = "copy!@#$"; String enCryptPasswd = cryptoOnewayPasswd.encryptPassword(password, id);
LOGGER.info(enCryptPasswd); return null; }
} |
결과
String id= "copycoding";
String password = "copy!@#$";
비밀번호를 암호화 하고 결과를 로그에 출력하였습니다.
[log4j]2019-09-28 17:49:25,749 INFO [copycoding.com.util.crypto.web.CryptoOnewayPasswdController] r639j2srhlNLZTGU7MR02JzILbBi5X5wOHlmLqPtjks= |
단방향 암호화가 필요하면 이런식으로 생성하면 됩니다.
3. 전체 소스
- Service
package copycoding.com.util.crypto.service;
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Base64; import org.springframework.stereotype.Service;
@Service("cryptoOnewayPasswd") public class CryptoOnewayPasswd {
/** * 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용) * * @param password 암호화될 패스워드 * @param id salt로 사용될 사용자 ID 지정 * @return * @throws Exception */ public static String encryptPassword(String password, String id) throws Exception {
if (password == null) return ""; if (id == null) return ""; // KISA 보안약점 조치
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset(); md.update(id.getBytes());
hashValue = md.digest(password.getBytes());
return new String(Base64.encodeBase64(hashValue)); } }
|
- Controller
package copycoding.com.util.crypto.web;
import javax.annotation.Resource;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping;
import copycoding.com.util.crypto.service.CryptoOnewayPasswd;
@Controller public class CryptoOnewayPasswdController { private static final Logger LOGGER = LoggerFactory.getLogger(CryptoOnewayPasswdController.class);
@Resource(name = "cryptoOnewayPasswd") private CryptoOnewayPasswd cryptoOnewayPasswd;
@RequestMapping("/copycoding/cryptoOnewayPasswd.do") public String cryptoPasswd(ModelMap model) throws Exception {
String id= "copycoding"; String password = "copy!@#$"; String enCryptPasswd = cryptoOnewayPasswd.encryptPassword(password, id);
LOGGER.info(enCryptPasswd); return null; }
}
|
- copy coding -
'Framework' 카테고리의 다른 글
Eclipse Data Source Explorer Oracle 설정 (0) | 2019.12.14 |
---|---|
전자정부프레임워크 ckeditor 웹에디터 적용 (0) | 2019.09.29 |
전자정부 프레임워크 validator (0) | 2019.09.22 |
eclipse font 변경 (0) | 2019.09.12 |
전자정부프레임워크 ARIA 블록 알고리즘 암호화 복호화 (0) | 2019.09.07 |