용테크

[JAVA] AES256 Cipher 본문

JAVA/Etc

[JAVA] AES256 Cipher

YongT 2020. 7. 30. 12:59

AES256 암호화

주로 평문 데이터를 암호화하는데 많이 쓰이며, 비밀키 하나로 데이터를 암호화 하고 복호화를 하며 사용하게 된다. 장점으로는 AES128과 비교하였을때는 당연히 보안성과 안전성이 높다고 말할수 있으며, 더 멀리 나아가 비대칭키(공개키 암호화시스템)보다 속도가 빠르다는 이점을 가지고 있다.

 

블록암호화를 진행하기 위해서는 패딩기법이 필요하다. 데이터를 특정크기로 맞추기 위해서, 특정크기보다 부족한 부분의 공간을 의미없는 문자들로 채워서 비트수를 맞추는 것이다. 

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

 

안전한 암호화를 위한 AES 알고리즘에 대한 이해와 구현코드(Java, C#)

https://dailyworker.github.io/AES-Algorithm-and-Chiper-mode/

 

안전한 암호화를 위한 AES 알고리즘에 대한 이해와 구현코드(Java, C#)

개요오랜만에 쓰는 글입니다. 요 근래 정신이 너무 없어서 블로그 글도 못쓰고 있던 찰나에 인턴으로 근무하고 있는 회사에서 맡게 된 업무인 C# 암호화, Java 복호화에 대해서 설명하고자 합니다

dailyworker.github.io

 


 

Database의 접속정보 config파일에서 P/W가 평문으로 노출되고있어 AES256 암호화방식으로 암호화 해주었다.

String value= Cipher.encrypt("1234",IDataSourceInfo.VALUE_ENCRYPTION_KEY,CipherMode.AES256);

위의 코드는 자사 솔루션 패키지안에 포함되어있는 Cipher Class를 이용한 방식이고..(자사 솔루션으로 프로젝트 투입되었을때 사용하면 될것같다.) 아래와 같은 방식으로 AES256암호를 암호와, 복호화 하면된다.

public class AES256Util {
	private String iv;
	private Key keySpec;

	/**
	 * 16자리의 키값을 입력하여 객체를 생성한다.
	 * 
	 * @param key
	 *            암/복호화를 위한 키값
	 * @throws UnsupportedEncodingException
	 *             키값의 길이가 16이하일 경우 발생
	 */
	final static String key = "비밀키입력하는곳";

	public AES256Util() 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://happy-hs.tistory.com/15

'JAVA > Etc' 카테고리의 다른 글

[JAVA] URL호출을 이용한 File Download  (0) 2020.07.30
Comments