Development/Etc

암호화/복호화

비완 2019. 10. 21. 14:53
반응형

웹개발시 암호화는 로그인 비밀번호를 암호화하곤 하여 대부분 단방향으로만 암호화를 진행했었다.
그런데 간혹 양방향으로 암호화/복호화가 필요한 경우가 있어 별도의 Class로 이를 구현하였고 정리하고자 작성한다.

package com.test.xxx;

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;

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 = iv.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");
    }
}

암호화할 때는 아래와 같이

String key = "text_for_encrypt_key" // 16자리 이상
URLCodec codec = new URLCodec();
AES256Util aes256 = new AES256Util(key);
encrypted = codec.encode(aes256.encrypt(password));

복호화할 때는 아래와 같이 사용하면 된다.

String key = "text_for_encrypt_key" // 16자리 이상
URLCodec codec = new URLCodec();
AES256Util aes256 = new AES256Util(key;
decrypted = aes256.decrypt(codec.decode(encPassword));

반응형

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

[Oracle] 여러 row 하나로 합치기  (0) 2020.03.05
git reset 으로 날린 내용 복구  (0) 2019.11.08
Table 복사  (0) 2019.09.26
한달 날짜 조회  (0) 2019.01.10
week no 를 month 로 변환  (0) 2018.10.24