JAVA

스프링부트 블로그 만들기 – 암호화

blog app

암호화

OSI 7계층

OSI 7계층이란 네트워크에서 통신이 일어나는 과정을 7단계로 설명한 것

통신이 일어나는 7단계
7계층 응용 계층
6계층 표현 계층
5계층 세션 계층
4계층 전송 계층
3계층 네트워크 계층
2계층 데이터 링크 계층
1계층 물리 계층
osi 계층

7계층

클라이언트가 프로그램(Web Browser)을 더블클릭한다.

6계층

데이터를 암호화한다. 데이터를 MINE 타입으로 전송

5계층

통신을 위한 대문. 경로를 판단한다. 이 단계에서 문이 열리지 않으면 통신이 끝난다.

4계층

어떤 통신(TCP/UDP)을 할지 결정한다.

3계층

데이터를 목적지까지 이동시키기 위한 최적의 경로를 만들어낸다.

최적의 경로

데이터 전송시 전류의 소실로 인한 데이터 유실을 방지하기 위해 데이터 전송 경로가 여러 갈래로 나뉘어져 있다. 중간에 트랜지스터(전류를 증폭 시키기 위한 리피터)를 두고 라우터 역할을 하게 만들어 가장 가깝고 용량에 여유가 있는 경로로 데이터를 전송하게 만드는데 이를 최적의 경로라고 부른다.

2계층

맥 주소 통신(내부 통신)을 담당한다.

맥 주소

통신할 수 있는 하드웨어라면 고유 번호를 유일하게 가지고 있는데 이를 맥 주소라고 부른다. 맥 주소는 내부 통신 시에 사용하는 주소로 우리가 공유기를 통해 집 안에 여러대 있는 컴퓨터를 연결할 때 이 주소를 사용하고 있다.

1계층

데이터를 전달한다.

전송제어 프로토콜 TCP/UDP

TCP

Three way handshaking 방식의 프로토콜. 응답(response)에 대한 요청(request)까지 필요하기 때문에 안정적인 전송 방식이지만 위조의 위험성과 보안유지에 취약하다.

UDP

일방적인 요청(request)을 하는 방식으로 통신은 빠르지만 오류 검출을 하지 못하기 때문에 신뢰성이 떨어지는 통신방식이라고 불린다. 가까운 예로 전화, 영상이 있다.

1.util 패키지 안에 SHA.java 파일을 만들어준다.
package com.cos.blogapp.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA {													//MyAlgorithm 타입만 넣을 수 있게 만든다. 
  public static String encrypt(String rawPassword, MyAlgorithm algorithm) { //함수 내부 전체에 예외처리
    //1. SHA256 함수를 가진 클래스 객체 가져오기 
    MessageDigest md = null;
    try {
      md = MessageDigest.getInstance(algorithm.getType()); //getInstance = 실생시 new(static)한 것을 재사용(싱글톤)
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } 
    
    //2. 비밀번호 1234 -> SHA2256에 던지기
    md.update(rawPassword.getBytes()); //바이트로 바꿔서  

    //3. 암호화된 글자를 16진수로 변환(헥사코드)
    StringBuilder sb = new StringBuilder();
    for(Byte b : md.digest()) {
      sb.append(String.format("%02x", b));
    }
    return sb.toString();
    
  }
}

SHA.java 테스트

스프링에서 테스트를 할 수 있는 파일이 따로 존재하니 여기에서 junit으로 테스트를 해 볼 수 있다.
spring test
맥과 윈도우에서 모양이 조금 달라요.
package com.cos.blogapp.util;

 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;

 import org.junit.jupiter.api.Test;

 public class SHATest {

 	@Test
 	public void encrypt() {
 		String salt = "코스";
 		String rawPassword = "1234!"+salt;

 		// 1. SHA256 함수를 가진 클래스 객체 가져오기
 		MessageDigest md = null;
 		try {
 			md = MessageDigest.getInstance("SHA-256");
 		} catch (NoSuchAlgorithmException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}

 		// 2. 비밀번호 1234 -> SHA256 던지기
 		md.update(rawPassword.getBytes());

 //		for(Byte b : rawPassword.getBytes()) {
 //			System.out.print(b);
 //		}

 		System.out.println();

 		StringBuilder sb = new StringBuilder();
 		for(Byte b : md.digest()) {
 			sb.append(String.format("%02x", b));
 		}
 		System.out.println(sb.toString());
 		System.out.println(sb.toString().length());

 	}
 }

암호화 알고리즘 종류
SHA-256
SHA-512

2.util 패키지 안에 MyAlgorithm.java라는 이름의 enum 파일을 만들어준다.
package com.cos.blogapp.util;

import lombok.Getter;

@Getter
public enum MyAlgorithm {
  SHA256("SHA-256"), SHA512("SHA-512");
  
  String type;
  
  private MyAlgorithm(String type) {
    this.type = type;
  }
  
}

 

MyAlgorithm.java 테스트

package com.cos.blogapp.util;

 import org.junit.jupiter.api.Test;

 public class MyAlgorithmTest {

 	@Test
 	public void test1() {
 		System.out.println(MyAlgorithm.SHA256.ordinal());
 	}
 }

Hash(해시)
해시란 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑(mapping)한 값이다. 복호화가 불가능하기 때문에 암호화에 있어서 매우 중요한 요소이다. 레인보우 테이블을 이용해 유추해내는 방법이 있지만 salt를 사용해서 이를 해결할 수 있다. 본 프로젝트에서는 사용하지 않았다.

주소설계
도메인 적는 이유 : 인증과 권한을 필터링하기 위해서다.
/board에서 세션을 체크하여 인증과 권한이 없는 사용자를 필터링하면 코드를 짜기 쉬워진다.

게시판 기능 인증/권한 HTTP 메서드
게시글쓰기 (인증 POST /board /board
게시글쓰기페이지 (인증) GET /writeForm /board/saveForm
게시글목록보기 (X) GET /list /
게시글삭제 (인증, 권한) DELETE /delete /board/{id}
게시글수정 (인증, 권한) PUT /update /board/{id}
게시글상세보기 (X) GET /detail /board/{id}

-> HTTP 메서드가 다르면 같은 주소라도 충돌나지 않는다.

Docker
컨테이너 기반의 오픈소스 가상화 플랫폼이다. 프로그램과 OS 환경을 컨테이너에 실어 이동할 수 있다.
OS 환경이 서로 다른 프로그램을 별도의 추가 설치 없이 사용할 수 있게 해주기 때문에 최근 개발에 자주 사용되고 있다.

 

최신글