ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 암호화, 복호화 처리
    [공부] 프로그래밍/Spring・Spring Boot (JAVA) 2024. 3. 14. 14:44

     

    // AES 암호화 알고리즘
    private static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding";
    // 16자로 인코딩된 암호화 키
    private static final String ENC_KEY = "!testtesttestTTT";
    // 암호화에 사용되는 초기화 벡터
    private static final String IV_KEY = "testtesttestTTT";
    // 문자열을 바이트로 변환하는 데 사용되는 문자 인코딩
    private static final String CHARSET = "UTF-8";
    AES_ALGORITHM (AES 암호화 알고리즘):
    ◇ 이 변수는 AES 암호화에 사용할 알고리즘 및 암호화 모드와 패딩 방식을 지정합니다.
    ◇ AES는 Advanced Encryption Standard의 약자로 대칭 키 알고리즘 중 하나입니다. CBC(Cipher Block Chaining) 모드와 PKCS5Padding 패딩을 사용하도록 지정되었습니다.
    ◇ CBC 모드는 암호화된 블록의 이전 블록을 사용하여 현재 블록을 암호화하는 데 사용됩니다. 이를 통해 동일한 평문 블록이 동일한 암호문 블록으로 변환되는 것을 방지합니다.

    ENC_KEY (암호화 키):
    ◇ 이 변수는 암호화에 사용되는 대칭 키를 나타냅니다.
    ◇ 대칭 암호화에서는 암호화 및 복호화에 동일한 키가 사용되며, 이 키가 안전하고 비밀로 유지되어야 합니다.
    ◇ 보안성을 높이기 위해 16자로 인코딩 된 긴 무작위 문자열로 설정되어 있습니다.

    IV_KEY (초기화 벡터):
    ◇ 이 변수는 CBC 모드에서 사용되는 초기화 벡터를 나타냅니다.
    ◇ CBC 모드에서는 각 블록의 암호화를 위해 초기화 벡터가 필요하며, 이를 통해 블록들이 서로 독립적으로 암호화되는 것을 보장합니다.
    ◇ 초기화 벡터는 암호화에 사용되지만 비밀로 유지될 필요는 없습니다.

    CHARSET (문자 인코딩):
    ◇ 이 변수는 문자열을 바이트 배열로 변환하는 데 사용되는 문자 인코딩을 지정합니다.
    ◇ UTF-8은 유니코드 문자를 효율적으로 인코딩하는 데 널리 사용되며, 대부분의 경우 문자열 처리에 안전한 선택입니다.

    암호화 처리
    // 내부적으로 암호화를 수행하는 개인 메서드입니다. 
    // 암호화 키와 초기화 벡터로 암호화를 수행한 다음 Base64 인코딩을 사용하여 문자열을 암호화합니다.
    private String encode(String str) throws Exception {
    
        SecretKeySpec key = new SecretKeySpec(ENC_KEY.getBytes(CHARSET), "AES");
        IvParameterSpec iv = new IvParameterSpec(IV_KEY.getBytes(CHARSET));
    
        // 암호화 키 생성
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);
        byte[] byteResult = cipher.doFinal(str.getBytes(CHARSET));
    
        // 암호화
        return Base64.getEncoder().encodeToString(byteResult);
    }
    1. SecretKeySpec 및 IvParameterSpec를 사용하여 암호화 키와 초기화 벡터를 생성합니다. 이들은 암호화 프로세스에서 필요한 키 및 초기화 벡터를 나타냅니다.
    2. Cipher를 사용하여 AES 알고리즘을 사용하도록 설정합니다. 이때 ECB 모드나 CBC 모드, PKCS5Padding과 같은 알고리즘 및 패딩 방식을 지정할 수 있습니다.
    3. Cipher를 초기화하고 암호화 모드로 설정합니다. 이때 암호화 키와 초기화 벡터가 사용됩니다.
    4. 주어진 문자열을 바이트 배열로 변환한 후, 암호화를 수행하여 암호화된 바이트 배열을 얻습니다.
    5. 마지막으로, 암호화된 바이트 배열을 Base64 인코딩하여 암호화된 문자열을 생성하고 반환합니다.

    이러한 과정을 통해 주어진 문자열이 안전하게 암호화되고, Base64 인코딩 된 형태로 반환됩니다.

    복호화 처리
    // 내부적으로 복호화를 수행하는 개인 메서드입니다. 
    // 암호화 키와 초기화 벡터로 암호화를 수행한 다음 Base64로 인코딩된 문자열을 복호화합니다.
    private String decode(String str) throws Exception {
        SecretKeySpec skey = new SecretKeySpec(ENC_KEY.getBytes(CHARSET), "AES");
        IvParameterSpec ivp = new IvParameterSpec(IV_KEY.getBytes(CHARSET));
    
        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, skey, ivp);
        byte[] byteResult = cipher.doFinal(Base64.getDecoder().decode(str));
    
        return new String(byteResult, CHARSET);
    }
    1. SecretKeySpec 및 IvParameterSpec를 사용하여 복호화 키와 초기화 벡터를 생성합니다. 이들은 복호화 프로세스에서 필요한 키 및 초기화 벡터를 나타냅니다.
    2. Cipher를 사용하여 AES 알고리즘을 사용하도록 설정합니다. 이때 ECB 모드나 CBC 모드, PKCS5Padding과 같은 알고리즘 및 패딩 방식을 지정할 수 있습니다.
    3. Cipher를 초기화하고 복호화 모드로 설정합니다. 이때 복호화 키와 초기화 벡터가 사용됩니다.
    4. 주어진 문자열을 Base64 디코딩하여 암호화된 바이트 배열을 얻습니다.
    5. 마지막으로, 암호화된 바이트 배열을 복호화하여 평문으로 변환하고, 이를 문자열 형태로 반환합니다.

    이러한 과정을 통해 주어진 암호화된 문자열이 안전하게 복호화되고, 원래의 평문으로 변환됩니다.

     

    '[공부] 프로그래밍 > Spring・Spring Boot (JAVA)' 카테고리의 다른 글

    FreeMarker 설정  (0) 2024.04.03
    HTTP DELETE 처리  (2) 2024.04.02
    enum  (0) 2024.03.05
    Repository 테이블 조작  (0) 2024.03.01
    Bean Validation 처리  (0) 2024.03.01
Designed by Tistory.