[Java] AES-256으로 암호화 복호화 방법 알아보기

2021-09-18


Photo by Dmitry Osipenko on Unsplash

사용자 및 회원의 정보중 아이디 비밀번호 휴대폰 번호 이메일 등... 민감한 정보들이 있다. 이러한 정보들을 암호화 없이 데이터베이스 저장할 경우 법적으로 문제가 될 수 있는데, 이러한 경우에 필요한 과정이 바로 암호화이다. 오늘은 많은 암호화 방법 중 간단하고 강력한 AES-256 암호화하는 과정을 빠르게 알아보도록 하자. 


- 예제

 

예제는 간단히 사용자의 아이디를 암호화하는 과정을 나타낸다. 여러 암호화 할 데이터를 리스트 형식으로 받아서 루프를 돌려 처리해도 되며, 사용방법은 본인의 자유이다.

 

package com.win.test.controller;

import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class a_00test_aes256 {

	public static void main(String[] args) {
		//알고리즘
		String alg = "AES/CBC/PKCS5Padding";
		//키
		String aesKey = "abcdefghabcdefghabcdefghabcdefgh"; //32byte

		String aesIv = "0123456789abcdef"; //16byte

		//암호화 할 유저 아이디
		String userId ="abc123";
		
		//암호화된 유저 아이디
		String encId="";

		
		//알고리즘 aes-256 **********[암호화]**********
		try {

			Cipher cipher = Cipher.getInstance(alg);

			//키로 비밀키 생성
			SecretKeySpec keySpec = new SecretKeySpec(aesKey.getBytes(), "AES");
			//iv 로 spec 생성
			IvParameterSpec ivParamSpec = new IvParameterSpec(aesIv.getBytes());
			//암호화 적용
			cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);

			//암호화 실행
			byte[] encrypted1 = cipher.doFinal(userId.getBytes("UTF-8")); // ID 암호화(인코딩 설정)
			encId = Base64.getEncoder().encodeToString(encrypted1); // 암호화 인코딩 후 저장

			System.out.println("암호화된 유저 아이디 -> " + encId);

		}catch (Exception e) {
			System.out.println("암호화 중 오류 발생 ");
			e.printStackTrace();
		}
		//---------------------------------------------------------------------------


		
		
		
		
		
		
		//----암호화 해석 코드 **********[복호화]**********
		try {
			Cipher cipher = Cipher.getInstance(alg);

			SecretKeySpec keySpec = new SecretKeySpec(aesKey.getBytes(), "AES");
			IvParameterSpec ivParamSpec = new IvParameterSpec(aesIv.getBytes());
			cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
			
				//암호 해석
				byte[] decodedBytes = Base64.getDecoder().decode(encId);
				byte[] decrypted = cipher.doFinal(decodedBytes);
				String result = new String(decrypted);
				
				
				System.out.println("복호화한 유저 아이디 -> " + result);

		}catch (Exception e) {
			e.printStackTrace();
		}
		//---------------------------------------------------------------------------

	}
}

 

위와 같은 코드로 암호화와 복호화를 진행하면 된다. 여기서 중요한 부분은 키값과 IV(초기화 백터 값) 이 두 가지이며 키값은 32byte IV 값은 16byte 값으로 지정해 주면 된다. 잘 모르겠으면 영어 숫자 기준 키값은 32자리 IV 값은 16자리 적어 넣어주면 된다. 한자리라도 적거나 크면 컴파일에서 에러가 나니 정확히 확인해 주는 것이 좋다.


메인 이미지 출처 : Photo by Dmitry Osipenko on Unsplash