실제로 프로젝트에서 사용하기 위해 만들었던 코드로 org.apache.commons.codec 라이브러리에 의존성을 가지고 있다. AES256Util 객체를 생성할때에는 암호화/복호화에 사용될 키를 입력받는다. 스프링 빈컨테이너에 키를 넣어 생성해서 사용하기 위해서 만들었으나 쉽게 생성자를 수정하고 맴버변수를 등록하도록 수정하여 사용할 수도 있다, 단 키의 길이가 16자리 이하일 경우 오류가 발생한다. 개발전 준비단계에 언급한 local_policy.jar 파일과 US_export_policy.jar 추가 다운로드한 라이브러리가 없을 경우에는 16자리의 키를 입력하더라고 java.security.InvalidKeyException: Illegal key size이 발생한다.
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* 양방향 암호화 알고리즘인 AES256 암호화를 지원하는 클래스
*/
public class AES256Util {
private String iv;
private Key keySpec;
/**
* 16자리의 키값을 입력하여 객체를 생성한다.
* @param key 암/복호화를 위한 키값
* @throws UnsupportedEncodingException 키값의 길이가 16이하일 경우 발생
*/
public AES256Util(String key) throws UnsupportedEncodingException {
this.iv = key.substring(0, 16);
byte[] keyBytes = new byte[16];
byte[] b = key.getBytes("UTF-8");
int len = b.length;
if(len > keyBytes.length){
len = keyBytes.length;
}
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
this.keySpec = keySpec;
}
/**
* AES256 으로 암호화 한다.
* @param str 암호화할 문자열
* @return
* @throws NoSuchAlgorithmException
* @throws GeneralSecurityException
* @throws UnsupportedEncodingException
*/
public String encrypt(String str) throws NoSuchAlgorithmException, GeneralSecurityException, UnsupportedEncodingException{
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
String enStr = new String(Base64.encodeBase64(encrypted));
return enStr;
}
/**
* AES256으로 암호화된 txt 를 복호화한다.
* @param str 복호화할 문자열
* @return
* @throws NoSuchAlgorithmException
* @throws GeneralSecurityException
* @throws UnsupportedEncodingException
*/
public String decrypt(String str) throws NoSuchAlgorithmException, GeneralSecurityException, UnsupportedEncodingException {
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
byte[] byteStr = Base64.decodeBase64(str.getBytes());
return new String(c.doFinal(byteStr), "UTF-8");
}
}
참고 자료 : https://nnoco.tistory.com/175
'백엔드 > Java' 카테고리의 다른 글
멀티스레드 환경에서의 Thread-safe 테스트 (0) | 2024.03.20 |
---|---|
하나의 프레임워크에서어 앱 업로드와 웹 업로드시 문제점 (0) | 2024.03.20 |
PK (Auto_increment) 가져오기 (0) | 2024.03.20 |
@Async가 먹히지 않는 경우는 3가지 (0) | 2024.03.20 |
SHA-256 (0) | 2024.03.20 |
알고리즘 (0) | 2024.03.20 |
같은 단어 제거 정규식 (0) | 2024.03.20 |
자바 정수범위 (0) | 2024.03.20 |
댓글