작업 환경

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를 만들어서 사용해 보았습니다.



egov passwd crypto


 

내용은 기존 소스를 복사했고요.

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를 하나 작성 합니다.


egov passwd crypto


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 -

작업 환경

eGovFramework Version : 3.8

Eclipse Version : Oxygen.3a Release (4.7.3a)

JDK Version : 1.8

 

데이터의 validator는 화면에서 입력한 데이터를 Server로 보내기 전 검증과 Server에서는 받은 데이터를 처리하기 전의 검증으로 나뉘어 집니다.  뭏론 화면에서 javascript로 파라미터를 하나씩 검증하는 방법을 사용하기도 하지만 작업이 어렵지 않으니 한번 사용해 봅니다.

작업도 간단합니다. jsp, xml, Vo, Controller만 작성해 주면 됩니다.

 

Vo 작성

service 패키지를 만들고 vo를 생성하여 입력 받을 데이터들을 설정 합니다

 

public class ValidatorTestVo {

 

         private String id;

         private String name;

         private int age;

        

        

         public String getId() {

                  return id;

         }

         public void setId(String id) {

                  this.id = id;

         }

         public String getName() {

                  return name;

         }

         public void setName(String name) {

                  this.name = name;

         }

         public int getAge() {

                  return age;

         }

         public void setAge(int age) {

                  this.age = age;

         }

 

}

 

validator xml 작성

 

resource 폴더 validator에 임의의 폴더를 생성 합니다.  물론 기존 폴더에 xml만 추가해도 됩니다.

생성한 폴더에 임의의 xml 파일을 생성 합니다. 여기서는 다음과 같이 폴더와 파일을 생성 했습니다.

ValidateTest.xml 파일에 검사할 항목들을 추가 합니다.

<form-validation>

 

    <formset>

                  <form name="validatorTestVo">

                           <field property="id" depends="required">

                   <arg0 key="아이디" resource="true"/>

                           </field>

                           <field property="name" depends="required">

                   <arg0 key="이름" resource="true"/>

                           </field>

                           <field property="age" depends="required, integer">

                   <arg0 key="나이" resource="true"/>

                           </field>

                  </form>

    </formset>

 

</form-validation>

 

Controller 생성

 

web 패키지를 생성하고 Controller를 만듭니다.

 

@Controller

public class ValidatorTestController {

 

         @Autowired

         private DefaultBeanValidator beanValidator;

 

         @RequestMapping("/validator/validatorTest.do")

         public String index(ModelMap model) {

                  return "copycoding/validator/ValidatorTest";

         }

        

         @RequestMapping("/validator/formValidate.do")

         public@ResponseBody String selectGridSampleList(@ModelAttribute("validatorTestVo") ValidatorTestVo validatorTestVo, BindingResult bindingResult, ModelMap model) throws Exception {

                 

                  beanValidator.validate(validatorTestVo, bindingResult); // validation 체크를 수행하여 검사        

                 

          if (bindingResult.hasErrors()) {

                  model.addAttribute("validatorTestVo", validatorTestVo); // validation 오류 발생한 경우 리턴 처리

                           return "";

                  }

                 

                  return null;

         }

}

 

JSP 파일 생성

 

이제 마지막으로 화면을 위한 폴더와 파일을 생성 합니다.

 

egovframework validator

 

 

상단에 validatorlib를 추가 합니다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<script type="text/javascript" src="<c:url value="/validator.do"/>"></script>

<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>

 

validatorjavascript도 추가를 해줍니다.

<validator:javascript formName="validatorTestVo" staticJavascript="false" xhtml="true" cdata="false"/>

 

<script type="text/javaScript" language="javascript">

function fncValidatorInsert() {

 

    var varFrom = document.getElementById("validatorTestVo");

    varFrom.action = "<c:url value='/validator/formValidate.do'/>";

 

    if(confirm("저장 하나요?")){

        if(!validateValidatorTestVo(varFrom)){

            return;

        }else{

            if(ipValidate())

                varFrom.submit();

            else

                return;

        }

    }

}

</script>

 

validatorform을 다음과 같이 작성 합니다.

<form:form commandName="validatorTestVo" method="post" action="${pageContext.request.contextPath}/validator/formValidate.do' />">

<table class="wTable">

         <tr>

                  <td><input id="id" name="id" type="text"></td>

         </tr>

         <tr>

                  <td><input id="name" name="name" type="text"></td>

         </tr>

         <tr>

                  <td><input id="age" name="age" type="text"></td>

         </tr>

         <tr>

                  <td><input class="s_submit" type="submit" value="save" onclick="fncValidatorInsert(); return false;" /></td>

         </tr>

</table>

</form:form>

 

테스트를 진행

 

먼저 아무것도 입력하지 않고 저장 버튼을 클릭 하는 경우

egovframework validator

 

모두 필수 값이므로 입력을 하도록 메시지가 출력 됩니다.

 

모두 문자를 입력한 경우

 

egovframework validator

 

age는 숫자 이므로 숫자 입력 메시지가 출력 됩니다.

좀더 상세한 설정이 필요하면 validatorxml을 설정하면 됩니다.

 

- copy coding -


워드 작업 중 탭의 간격이 너무 크거나 작은 경우 설정 방법 입니다문서 작업 중 일정한 간격을 유지 하기 위해 스페이스 바를 사용하는 경우가 있는데 설정 값에 따라 글자가 앞쪽으로 나오는 경우가 있고 탭 간격이 너무 크면 보기에도 좋지 않습니다.  아래와 같은 문서가 있을 경우


MS Word 탭 간격 설정


현재는 탭 간격이 4글자로 설정된 경우 입니다설정 창을 열기 위해서는 두가지 방법이 있습니다.

 

1. 문장에서 설정 창 열기


문장 아무 곳에서나 마우스 우클릭을 하면 팝업 메뉴가 나오는데 여기서 단락을 선택 합니다.


MS Word 탭 간격 설정


단락 창에서 좌측 하단을 보면 탭 버튼이 있습니다.  


MS Word 탭 간격 설정


탭 버튼을 클릭해 줍니다.

 

우측에 기본 탭 값이 4글자로 되어 있는데 본인이 필요한 숫자로 변경을 하고 확인 버튼을 클릭 합니다.


MS Word 탭 간격 설정



2. 홈 메뉴에서 탭 설정 창 열기


홈 메뉴를 클릭 하고 단락 하부메뉴를 보면 확장 아이콘이 있습니다.  


MS Word 탭 간격 설정


이 아이콘을 선택 하면 단락 설정 창이 나타나고 설정은 위에서 진행한 방식과 동일하게 하면 됩니다.


- copy coding -


에머랄드 구슬이 책상 위에 영롱하게 빛나는 꿈 해몽

 -> 새로운 물건이나 특효약을 발명하거나, 명예, 승진, 합격, 당선, 취득, 승리, 재물, 낙찰, 문서결재, 계약 등의 길조가 있으며, 학생은 학업성적이 오르게 된다.


에머랄드로 만든 꽃이 화려하게 피어 있는 꿈 해몽

 -> 훌륭한 작품과 신소재를 발명하게 된다.


에머랄드로 만든 연필로 글씨를 쓰는 꿈 해몽

 -> 훌륭한 대작을 창작하여 새로운 문화의 장을 연다.


에머랄드로 만든 장승이 마을 입구에 서 있는 꿈 해몽

 -> 신으로부터 오복과 행운을 받거나, 윗사람의 도움으로 입신출세하며, 입학, 합격, 당선, 승진 등으로 기쁜 경사가 있다.


에메랄드와 관련된 꿈 해몽

 -> 상속 문제가 발생한다.


에메랄드를 팔거나 선물하는 꿈 해몽

 -> 애인과 이별한다.


에메랄드를 본인이 소유하는 꿈 해몽

 -> 일상에 행운이 함께 한다.

 

탤런트에게 금은보석을 받는 꿈 해몽

 -> 가정에 경사스러운 일이 있고 경제적으로 풍부해지거나, 횡재, 선물, 행운 등에서 길운이다.


우물 속에 잠긴 사파이어의 빛이 찬란한 꿈 해몽

 -> 매우 귀한 학문과 진리를 심도 있게 연구하거나, 학생은 두뇌가 발달하면서 학업성적이 올라간다.


파란 광석이 빛나는 꿈 해몽

 -> 노력한 뒤에 성공하여 입신출세 하거나, 승진, 합격, 당선, 승리 등의 경사가 발생하고,.재물과 돈이 들어온다는 뜻이다.




수정팔찌를 손목에 차고 있는 꿈 해몽

 -> 새로운 일거리로 인하여 사업전망이 트이거나, 부귀, 재물 등이 생긴다.


두 손에 넘칠 만큼 많은 보석을 얻은 꿈 해몽

 -> 재물 손실이나 사업에서 장애를 만나 실패하게 될 것을 말하는 꿈이다.


단 한 개의 빛나고 큰 보석을 얻은 꿈 해몽

 -> 매우 값지고 소중한 것을 얻게 될 징조이다.


귀한 보석을 가지고 타인에게 뺏길까 봐 전전긍긍하는 꿈 해몽

 -> 배우자가 바람을 피울까 항상 불안해하고 있다는 증거이다.


금은방에 가서 값비싼 보석을 사는 꿈 해몽

 -> 집안 살림이 궁핍해져서 가난한 생활을 해야 할 것이다.


보석을 잃고 안타까워하는 꿈 해몽

 -> 중요한 것을 잃어버릴 수 있다는 암시이다.


보석함에 있는 보석이 차츰 줄어서 아무것도 없는 꿈 해몽

 -> 사업이나 집안이 금전적으로 큰 손해를 보고 하향곡선을 타게 될 징조이다.


집 안에 있던 보석을 가족끼리 나누는 꿈 해몽

 -> 그 동안 모인 재산이 흩어질 것이다.


보석의 색깔이 변하는 꿈 해몽

 -> 신상에 좋지 않은 변화가 생길 것을 암시하는 꿈이다.


구리반지가 보석 반지로 변하는 꿈 해몽

 -> 은 분야의 최고가 되거나 명예, 부귀 등을 누릴 수 있게 되는 운명이다.


항문에 값비싼 패물을 감추는 꿈 해몽

 -> 아무도 모르게 돈 따위의 귀중품을 빼돌릴 일이 생긴다.


보석의 종류를 모르는 경우의 꿈 해몽

 -> 불행하고 우울한 시기를 나타낸다.


보석을 발견하는 꿈 해몽

 -> 불행하고 우울한 시기를 뜻한다.


보석을 잃어버리는 꿈 해몽

 -> 예상외의 수확이 생길 징조이다.


보석이 모조품인 꿈 해몽

 -> 자신과 관계된 생각지도 않은 헛소문이 퍼진다.


사파이어를 자신의 몸에 장식하고 있는 꿈 해몽

 -> 순간적인 감정에 사로잡힌 언행을 삼가 해야 한다.


사파이어를 다른 사람이 장식하고 있는 꿈 해몽

 -> 영향력 있는 친구가 사회적 지위를 끌어올려 줄 것이다.


수정, 크리스털의 꿈 해몽

 -> 지금까지 고민해 왔던 일들이 한꺼번에 해소되지만, 자신이 매우 상처 받기 쉬운 상황에 처해 있다.


수정이 깨지는 꿈 해몽

 -> 성가신 언쟁이 발생한다.


수정이나 크리스털이 글라스 같은 가정용품 인 꿈 해몽

 -> 행복한 사교생활을 암시한다.


실제로 다이아몬드를 소유한 사람이 꾸는 다이아몬드와 관련된 꿈 해몽

 -> 어떤 형태로든지 손실이 발생한다.


다이아몬드를 가지고 있지 않은 사람이 꾸는 다이아몬드와 관련된 꿈 해몽

 -> 약간의 이익이 생긴다.


다이아몬드를 발견하는 꿈 해몽

 -> 가정내의 불행한 일을 암시한다.


비취와 관련된 꿈 해몽

 -> 번영을 상징하거나, 신중하게 일을 처리해야만 쉽게 진행될 것이다.


다이아몬드 같은 보석을 박은 귀걸이 꿈 해몽

 -> 현재 의기소침해 있으므로 스스로 자신감을 회복해야 한다.


옥 항아리 안에 에메랄드가 가득 담겨 있는 꿈 해몽

 -> 많은 재물이 생기고 하는 사업이 잘 되며, 재수가 대통하고 소원성취한다.


옥 항아리 안에 진주 알이 가득 담겨 있는 꿈 해몽

 -> 집안에 부가 축적되면서 사업이 마음먹은 대로 잘 풀리며, 뜻밖의 재물이 생기고 귀인이 돕는다.


옥구슬이 달린 왕관을 머리에 쓰는 꿈 해몽

 -> 부귀공명하고 입신출세 하며, 권세, 명예, 승진, 당선, 합격, 입학, 학위, 자격취득, 승리, 성공, 소원성취 등에서 길조이다.


옥으로 만든 염주나 묵주를 걸고 있는 꿈 해몽

 -> 훌륭한 종교인으로 참된 신앙심을 갖고 중생을 구하거나, 높은 식견을 가진 도승이 되거나 사랑을 전파하는 전도사가 된다.


옥으로 만든 옷을 입는 꿈 해몽

 -> 부귀공명하고 대관직을 얻거나, 대표로 명성을 떨친다.


옥으로 만들어진 장신구가 즐비한 꿈 해몽

 -> 뜻밖에 횡재수가 있고 재물이 생기거나, 작품 전시회에 출품할 일이 생긴다.


앵두 알이 변해 영롱한 옥이 되는 꿈 해몽

 -> 영세한 사업이 축척 되어 큰 기업으로 성장하고, 큰 이득을 본다.


재물이나 이득이 생기는 꿈 해몽

 -> 좋은 선물을 받든지, 소망하던 일이 순조롭게 성사되는 즐거움이 있을 징조이다.


금고가 열려 있는 꿈 해몽

 -> 사업자금을 구하거나 정신적인 활동으로 깨달음을 얻게 된다.


악세서리(장신구)가 진짜 보석일 때의 꿈 해몽

 -> 지금 진행하고 있는 일이 반드시 호전된다.


악세서리가 모조품일 때의 꿈 해몽

 -> 지나친 자만 때문에 옆길로 빠지게 될 가능성이 있다.


장신구를 주거나 받는 꿈 해몽

 -> 매사가 순성 한다는 길몽이다.


장신구를 몸에 착용하는 꿈 해몽

 -> 항상 충동적인 언행을 삼가 해야 자신과 주위 사람이 마음에 상처를 받지 않는다.


귀걸이가 금으로 만들어진 꿈 해몽

 -> 일시적으로 좌절할 일이 있다.


귀걸이를 사는 꿈 해몽

 -> 자신의 센스나 아이디어가 좀 독특한 면이 있음을 뜻한다.


귀걸이를 잃어버리는 꿈 해몽

 -> 경제적인 어려움이 예상되므로 도박을 삼가야 한다.


목걸이를 착용하는 꿈  해몽

 -> 결혼하거나, 사업상의 승진이 있다.


가게에서 목걸이를 보는 꿈 해몽

 -> 누군가를 시기하고 있다.


팔찌와 관련된 꿈 해몽

 -> 기본적으로 행복을 상징한다.


자신의 팔에 팔찌를 착용하고 있는 꿈 해몽

 -> 애정 운이 매우 상승한다.


누군가가 자신에게 팔찌를 끼워 주는 꿈 해몽

 -> 곧 사랑에 빠져 결혼할 가능성이 매우 크다.


팔찌를 발견하는 꿈 해몽

 -> 자신을 혼란에 빠뜨릴 사람과 만나게 될 징조이다.


브로치를 착용하고 있는 꿈 해몽

 -> 상속을 받게 된다.


브로치를 사는 꿈 해몽

 -> 주위 사람 중의 누군가에게 속고 있다.


브로치를 파는 꿈 해몽

 -> 지갑을 분실하여 곤경에 처할 가능성이 매우 크니, 간수를 잘해야 한다.


- copy coding -


1···28293031323334···61

+ Recent posts