[JAVA] 개인정보 암호화 AES256

yeonjoo913·2023년 7월 3일

JAVA

목록 보기
5/19

진행중인 프로젝트에서 회원 개인정보 암호화를 해야해서 공부하게 되었다.
양방향 알고리즘을 사용하고 자바의 암복호화를 담당하는 JAVA Cipher class를 사용할 것이다.

JAVA Cipher class

cipher class는 AES,DES,RSA 등 다양한 방식을 제공한다.

  1. RAS
  • 비대칭키 알고리즘(공개키,비밀키를 사용)
  • 암호화 가능한 길이가 245byte로 제한되어 긴 문자열을 암호화하는데 적합하지 않다.
  1. AES
  • 대칭키 알고리즘(암복호화 시 동일한 키 사용)으로 블록단위 암호화를 수행
  • 이름,주소,연락처 등을 암복호화할때 가장 많이 사용되는 알고리즘
  • AES 종류 (숫자는 키의 길이)
    a. AES128
    b. AES192
    c. AES256
  • AES256의 장점
    a. AES128과 비교했을 때 보안성과 안전성이 높다.
    b. 비대칭키보다 속도가 빠르다.
  • AES256의 단점
    a. 키 한개로 암복호화를 하기 때문에 키가 유출되면 털린다.

❗️적용 코드

public class AES256 {

    public static String alg = "AES/CBC/PKCS5Padding";
    private final String key = "abcdefghabcdefghabcdefghabcdefgh"; // 32byte
    private final String iv = "0123456789abcdef"; // 16byte

    public String encrypt(String text) throws Exception {
        Cipher cipher = Cipher.getInstance(alg);
        SecretKeySpec keySpec = new SecretKeySpec(iv.getBytes(),"AES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);

        byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encrypted);
    }

    public String decrypt(String cipherText) throws Exception {
        Cipher cipher = Cipher.getInstance(alg);
        SecretKeySpec keySpec = new SecretKeySpec(iv.getBytes(), "AES");
        IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);

        byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
        byte[] decrypted = cipher.doFinal(decodedBytes);
        return new String(decrypted, "UTF-8");
    }

}

Cipher cipher = Cipher.getInstance(”AES/CBC/PKCS5Padding”);

cipher instance를 만들때 필수값 3가지가 있다.
비밀키 / 블록 암호 운용방식 / 패딩 기법

1. 비밀키(Secret Key) 선택

  • AES 선택

2. 블록 암호 운용 방식(Block Cipher Mode) 선택

a. CBC(Cipher Block Chaning) - 권장하는 방식

블록을 그대로 암호화 하지 않고 이전에 암호화 했던 블록과 XOR 연산을 한 다음에 암호화를 수행한다.
그래서 같은 내용을 갖는 원문 블록이라도 전혀 다른 암호문을 갖게된다. 그런데 첫번째 블록은 이전에 암호화 블록이 없기 때문에 IV(initialization vector)를 암호문 대신 이용한다. AES는 128Bit(16Byte) 단위로 암호화 하기 때문에 IV 역시 16Byte크기이다.
IV(초기화 벡터)
암호를 복호화할 사람에게 미리 제공되어야하고 키와 달리 공개되어도 상관없다.
송수신자가 IV를 어떤것으로 사용할지 정해두거나 파일에 IV를 기록해두는 방식으로 공유한다.

b. ECB(Electronic Code Book)

가장 간단한 구조로 암호화하려는 메세지를 여러블록으로 나누어 각 블록을 독립적으로 암호화 하는 방식이다.
단점으로는 키가 고정되어 있을 경우 평문 내에서 동일한 블록들은 암호화한 결과 또한 동일하다는 점이다. 즉 한개의 블록만 해독되도 나머지 블록이 해독된다.

3. 패딩 기법(Padding Mode) 선택

  • 블록 암호화를 진행하기 위해서는 패딩기법이 반드시 필요하다.
  • 데이터를 특정 크기로 맞추기 위해서, 특정 크기보다 부족한 부분의 공간을 의미없는 문자들로 채워서 비트 수를 맞추는 것이다.
  • 대표적으로 PKCS5,PKCS7 방식이 있다.
  • JAVA에서는 PKCS5 패딩모드를 사용해도 PKCS7이 적용된다.
profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글