HongCat 개발 스토리

7. AOP를 이용한 비밀번호 암호화 본문

FrameWork

7. AOP를 이용한 비밀번호 암호화

홍캣 2019. 12. 11. 20:41

1.AOP를 이용한 비밀번호 암호화

2.Hash알고리즘

  • 단방향으로 암호화 할 때 사용하는 알고리즘 
  • compression: 다양한 길이의 데이터를 입력해도 고정길이로 출력함. 
  • 효율성: 평문에서 암호문으로 변경하는 과정이 빠름
  • Collision-free: 메세지가 고유하다면 그에 대한 해시 값도 고유, 공백도 인지 
  • 해시 알고리즘 종류: MD5(복호화 코드 있어서 안전하지 않음), SHA(SHA-1, SHA-2,(SHA-224, SHA-256, SHA-384, SHA-512 등등)) 보안 강도가 강해짐

EX) 1234 -> aedk 암호화

1234567890 -> dkea 암호화     

1-> qeft  암호화

 

알고리즘의 기본 로직

1234-> aedk (문자형식으로 변환하는 것을 암호화)

aedk-> 1234 (원래대로 되돌림 복호화)

hash 알고리즘(보안에 사용)

1234->aedk 암호화

aedk->1234 복호화를 제공하지 않음

 

3. 비밀번호 암호화 실습

SHA256Util 클래스 파일과 MemberPass라는 클래스 파일을 만들어준다.

 

MemberPass.java 소스코드

package org.kh.member.common;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.kh.member.model.vo.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
@Aspect
public class MemberPass {
	@Autowired
	@Qualifier("SHA256Util")
	SHA256Util sha256Util;

	// insert 메소드를 포인트컷으로 지정
	@Pointcut("execution(* org.kh.member.model.service.MemberService.*Member(org.kh.member.model.vo.Member))")
	public void encPass() {
	}

	@Before("encPass()") //db에 들어가기전에 암호화 처리가 되어야 하므로 before를 이용
	public void passwordEnc(JoinPoint jp) throws Exception {
		Object[] args= jp.getArgs();
		Member m= (Member)args[0];// Member의 주소가 들어감
		String password=m.getMemberPw();
		System.out.println("암호화 전 PW:"+password);
		String encPw=sha256Util.encData(password);
		System.out.println("암호화 된 PW:"+encPw);
		m.setMemberPw(encPw);
	}

}

SHA256Util  소스코드

package org.kh.member.common;

import java.security.MessageDigest;

import org.springframework.stereotype.Component;

@Component("SHA256Util")
public class SHA256Util {
	public String encData(String data) throws Exception{// 패스워드 값을 매개변수로 받음
		//MessageDigest 클래스를 이용한 암호화
		MessageDigest mDigest=MessageDigest.getInstance("SHA-256");
		//password 값을 바이트 배열로 바꿔서 mDigest에 넣어줌
		mDigest.update(data.getBytes());
		//SHA-256으로 변환된 데이터를 byte배열로 꺼냄
		byte[] msgStr=mDigest.digest();
		//1byte 0~255까지 사용가능하지만 
		//정수는 음수까지 포함해서 -128~127 까지의 범위를 표현 가능
		//16진수로 변경 00~FF 범위로 변경할 예정
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<msgStr.length;i++) {
			byte tmpStrByte=msgStr[i];
			String tmpTxt=Integer.toString((tmpStrByte& 0xff)+0x100,16).substring(1);
			sb.append(tmpTxt);
			
		}
		return sb.toString();
	}
}

password가 암호화된 상태로 DB에 저장된 것을 볼 수 있다.

 

Comments