본문 바로가기
업무관련

[암호화] AES-256 암호화 관련 정의 및 HSM

by IronAreum 2023. 9. 10.
728x90

대외계로 요청/응답의 서비스를 개발하다가 보면 개인정보 항목의 경우 암호화 처리를 하는 경우가 있다. 

대외계(기관/타회사) 마다 사용하는 암호화의 방식이 다른데

 

최근 신규 서비스를 개발하면서 AES 암/복호화 처리하는 개발을 하게되서 (이미 한참되었지만 이제야 정리한다)

읽기목록에 저장해 두었던 내용을 정리할까함. 


단방향 암호화 알고리즘 / 양방향 암호화 알고리즘의 차이점

먼저 단방향 암호화는 평문을 암호화 했을때 다시 평문으로 되돌리는것(복호화)을 할수없는 암호화 방식.

패스워드 암호화에 사용되며, 대표적으로 'SHA-256'이 있다. 

 

양방향 암호화는 평문에서 암호문으로, 암호문에서 평문으로 변환할 수 있는 방식으로 대표적으로 'AES-256'이 있다. 

(개인정보 보호법에 따라 비밀번호, 바이오정보, 주민번호 등 고유식별정보의 경우 암호화 처리가 필요함)

 

AES(Advanced Encryption Standard) 고급 암호화 표준

AES는 암호화 및 복호화에 동일한 키를 사용하는 대칭키 알고리즘방식으로, 높은 안전성과 빠른 속도로 인해 양방향 암호화에 가장 많이 사용되는 방식이다.

AES 암호화의 종류는 AES-128, AES-192, AES-256이 있으며 뒤에 붙은 숫자는 키의 길이를 의미한다.
(128bit = 16byte, 192bit = 24byte, 256bit = 32byte)

 

 

[AES-256  암/복호화 샘플코드]

import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Encrypt {

    public static String alg = "AES/CBC/PKCS5Padding";
    private final String key = "abcdefghabcdefghabcdefghabcdefgh"; // 32byte
    private String iv = "0123456789abcdef"; // 16byte

    // 암호화
    public String encryptAES256(String text) throws Exception {
        Cipher cipher = Cipher.getInstance(alg);
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);

        byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encrypted);
    }

    // 복호화
    public String decryptAES256(String cipherText) throws Exception {
        Cipher cipher = Cipher.getInstance(alg);
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);

        byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
        byte[] decrypted = cipher.doFinal(decodedBytes);
        return new String(decrypted, "UTF-8");
    }
}

 

 

AES-256 암/복호화의 과정

암호화 : plain text  ->  pain bytes  ->  encrypt  ->  encrypted bytes  ->  encrypted base64 test
복호화 : encrypted base64 text  ->  encrypted bytes  ->  decrypt  ->  plain bytes  ->  plain text

 

728x90

AES 암호화에 꼭 필요한 4가지 요소

SecretKey,  IV(Initialize Vector),  Cipher Mode(EBC/CBC/...),  Padding Mode(PKCS5/PKCS7/...)

Java 기본 라이브러리 (javax.crypto.spec.SecretKeySpec, javax.crypto.spec.IvParameterSpec, javax.crypto.Cihper)

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

Cipher 클래스는 암호화, 복호화 기능을 제공하며 JCE famework의 핵심을 구성한다.

(JCE - Java Cryptography Extension)

 

Cipher 객체를 인스턴스화 하기 위해서는 static getInstance() 메서드를 호출하고 예시와 같이 원하는 변환 형태의 이름을 전달. ("AES/CBC/PKCS5Padding" => AES, CBC operation mode, PKCS5 padding scheme으로 초기화된 Cipher 객체) 

 

***

패딩(padding)이란, 블록의 암호화를 진행하기 위해 필요한 기법으로 데이터를 특정 크기로 맞추기 위해서 사용되며, 특정 크기보다 부족한 부분의 공간을 의미 없는 문자들로 채워서 비트수를 맞춰준다. (암호화 시에는 반드시 필요)

(자바에서는 PKCS5 패딩모드를 사용해도 PKCS7이 적용된다고 함.)

 

CBC

***

AES/CBC 방식의 경우 128bit의 고정된 블록 단위로 암호화를 수행하게 되는데, CBC mode는 위 이미지에서 볼 수 있는 것처럼 이전에 암호화했던 블록화 XOR 연산을 한 다음에 암호화를 수행한다.

그런데 첫 블록은 이전 암호화가 없기 때문에 이를 위해 IV(초기화 벡터)를 이용하는것임. AES는 128bit(16byte) 단위로 암호화하기 때문에 IV도 16byte의 크기가 필요하다. (중요!!!)  

 

 

***

IV(Initialize Vector), 초기화 벡터. 

위와 같은 원리로 매번 다른 IV를 생성하면 같은 평문이라도 다른 암호문을 생성할 수 있다. 또한 IV는 암호를 복호화할 사람에게 미리 제공되어야 하고 키와 달리 공개되어도 상관없다.

(미리 송신자와 수신자가 IV를 어떤 것으로 사용할지 정해두거나 파일에 IV를 기록해두는 방식으로 공유한다.)

 

IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
// 여기서 keyBytes는 key값을 byte로 변환하여 16byte의 길이만큼 복사한 값.

어떤 코드에서는 IV 값을 따로 주지 않고, key를 byte로 변환하여 16byte의 길이만큼 복사한 값을 IV로 사용하는 경우도 있다.

 

 

( 참고 ) IvParameterSpec Class

public class IvParameterSpec implements AlgorithmParameterSpec {
    private byte[] iv;

    public IvParameterSpec(byte[] var1) { 
        this(var1, 0, var1.length);
    }

    public IvParameterSpec(byte[] var1, int var2, int var3) {
        if (var1 == null) {
            throw new IllegalArgumentException("IV missing");
        } else if (var1.length - var2 < var3) {
            throw new IllegalArgumentException("IV buffer too short for given offset/length combination");
        } else if (var3 < 0) {
            throw new ArrayIndexOutOfBoundsException("len is negative");
        } else {
            this.iv = new byte[var3];
            System.arraycopy(var1, var2, this.iv, 0, var3);
        }
    }

    public byte[] getIV() {
        return (byte[])this.iv.clone();
    }
}

 

참고링크 

https://wildeveloperetrain.tistory.com/98

 

Java AES-256 양방향 암호화 제대로 알고 사용하기

'Java 양방향 암호화 AES-256 제대로 알고 사용하기' /* 프로젝트에서 양방향 암호화를 하기 위해서 AES-256 코드를 구글링 하여 사용하였는데, 나중에 알고 보니 사용하던 것이 AES-256이 아닌 AES-128인

wildeveloperetrain.tistory.com

http://it-archives.com/222142224519/

 

[JAVA] AES256 암호화 예제 – 흑곰의 유익한 블로그 2호점

[JAVA] AES256 암호화 예제 자바에서 AES256 으로 평문을 암호화하고, 암호화된 값을 평문으로 복호화하는 예제이다. Secret Key 가 “0123456789abcdefghij0123456789ab”일 때 encryptAES 메서드를 사용하면 평문

it-archives.com


암호화 키관리 솔루션 HSM에 관하여 

HSM(Hardware Security Module, 하드웨어 보안 모듈)은 암호키를 안전하게 저장하고 물리적, 논리적으로 보호하는 역할을 수행하는 강화된 변조 방지 하드웨어 장치입니다.

관리대상인 암호키를 HSM 내부에 저장하여 안전하게 관리하는 역할을 수행합니다.

일반적으로 암호화 API에서 암호키를 메모리 등에 탑재하여 활용하는 방식 대신에, HSM은 데이터에 대한 암복호화시 데이터를 HSM 내부에 보내어 결과 값을 받습니다. 즉, 암호키는 내부적으로 관리하여 외부에 유출이 되지 않고 암호 연산 자체가 HSM 내부에서 수행된다고 할 수 있습니다. 이러한 강력한 보안 기능을 통하여 암호키의 유출을 원천적으로 방지합니다.


암호화 보안은 데이터 암호화, 디지털 서명 생성 및 서명 확인의 기능을 수행하기 위해 암호 키를 반드시 같이 사용합니다. 암호화를 수행하는데 필요한 AES, ARIA, RSA, ECDSA 등 다양한 암호 알고리즘은 표준화되어 공개되어 있고 간단하게 사용 가능한 상용 및 무료 암호 API들을 손쉽게 구할 수 있습니다.

결국 암호화 보안에 있어서 보안 신뢰도는 암호 키를 얼마나 안전하게 은닉하여 보호하고 있느냐에 달려 있다고 할 수 있습니다.

암호화 기능에 사용되는 키를 포함하여 설계상 안전성이 보장되어야 하고 Malware 공격으로부터도 안전한 방법은 현재로서 하드웨어 기반이 가장 신뢰할 수 있습니다.

그 이유를 아래 그림을 통해 설명 드리겠습니다.

아래 그림은 DB 자체에서 제공하는 데이터암호화 기능인 TDE(Transparent Date Encryption)의 전형적인 암호키 계층 구조입니다.

제일 하단을 보시면 데이터를 보호하기 위해서 암호화하지만 아직 안전한 상태는 아닙니다.

따라서, 그 데이터를 암호화하기 위한 암호키(DEK, Data Encryption Key)도 다시 보호를 해야 합니다. 이를 위해서 DEK는 다시 TDE Master Key(KEK, Key Encryption Key)로 암호화하여 보호해야 합니다.

마지막, 최종적인 Master Key는 H/W 기반으로 보호를 해야 합니다. 이러한 계층 구조에서 암호화 시스템의 RoT는 H/W 기반이고 H/W 만큼의 안전성을 보장한다고 말할 수 있습니다.

이러한 RoT(Root of Trust)는 루트(root) 및 인증 기관 키를 생성하고 보호하기 위한 PKI(공개 키 인프라)에서는 특히 중요한 구성 요소입니다.

이제, H/W RoT의 전형적인 예로 HSM(Hardware Security Module), 하드웨어 보안 모듈을 설명하겠습니다.

 

│ HSM 의 종류 │

Pcle HSM - 내장형 HSM

내장형 PCI 타입의 HSM은 가장 일반적인 타입이며 개별적인 보안 시스템 장비에 탑재되어 사용할 수 있습니다.

API 인터페이스 규약인 PKCS#11를 활용하여 사용할 수 있습니다.

네트워크 연결형 HSM

네트워크 연결이 가능한 HSM 전용 장비입니다. 해킹 방지 및 성능을 위한 전용 OS와 SW를 사용하여

고성능이 필요한 분야에서 많이 사용합니다. 보안시스템 장비와 연결은 동일하게 PKCS#11 인터페이스를

사용하지만 PKCS#11 라이브러리와 장비간에 전용 TCP/IP 통신으로 연결합니다.

USB형 HSM

휴대형 USB 형태이며 일반적으로 보안 토큰이라고 통칭되고 있습니다.

개인용 소장 타입이며 공인인증서 보관, 전자지갑 등의 용도로 많이 사용합니다.

클라우드 HSM 서비스

대표적으로 AWS CloudHSM을 들 수 있습니다. AWS 클라우드상의 관리형 하드웨어 보안 모듈(HSM)로서 PKCS#11 인터페이스를 이용하여 동일하게 클라우드에서 사용할 수 있습니다.

반도체 타입 HSM

반도체 타입인 HSM Chip등이 있으며 암호 연산 자체가 내부적으로 수행되는 기능은 유사하지만,

HSM 인터페이스 표준인 PKCS#11을 지원하지 않는다는 점에서 다른 제품 군이라고 볼 수 있습니다.

 

참고링크 

https://blog.naver.com/mds_datasecurity/221950138311

 

암호키 관리를 위한 HSM(Hardware Security Module) - 정의와 종류

일반적으로 기업 및 단체는 개인 정보, 영업비밀 및 재무기록 등의 중요한 데이터 보호를 위하여 암호화를 ...

blog.naver.com

 

https://www.entrust.com/ko/resources/hsm/faq/what-are-hardware-security-modules

 

하드웨어 보안 모듈(HSM)이란 무엇입니까?

HSM이란 과연 정확히 무엇인지 궁금하시나요? 세계적인 브랜드들이 신뢰하는 글로벌정보보안업체 엔트러스트가 제공하는 정보를 지금 확인해 보세요.

www.entrust.com

 

728x90