키 암호화 키(KEK, Key Encryption Key)를 사용하는 과정
KEK (Key Encryption Key)
- 세션 키를 암호화하는 키입니다.
- 세션 키를 직접 저장하지 않고, 암호화된 상태로 저장하거나 전달할 수 있도록 보호합니다.
- KEK는 강력한 비밀번호나 패스워드 기반 키 파생 함수(PBKDF)를 통해 생성됩니다.
과정 설명
(1) 의사 난수 생성기로 세션 키 생성
- 암호화에 사용할 세션 키를 생성합니다.
- 세션 키는 암호화 알고리즘(AES, DES 등)에 따라 일정한 길이(예: 128비트, 256비트 등)로 생성됩니다.
- 세션 키는 **의사 난수 생성기(PRNG)**를 통해 예측 불가능한 값으로 생성합니다.
- 예: TLS에서 각 통신 세션마다 새 세션 키를 생성.
(2) KEK로 세션 키 암호화
- 세션 키를 직접 저장하지 않고, KEK로 암호화하여 저장합니다.
- KEK는 사용자가 입력한 패스워드와 솔트를 조합하여 생성합니다.
- KEK 생성 방법: PBKDF(Password-Based Key Derivation Function) 또는 KDF(Key Derivation Function) 사용.
- 솔트는 난수로 생성되며, KEK 생성 과정에서 사용됩니다.
- 생성된 KEK로 세션 키를 암호화하여 보호합니다.
- 예: EncryptedSessionKey = Encrypt(KEK, SessionKey)
- 암호화된 세션 키만 안전한 저장소에 보관하며, KEK는 저장하지 않습니다.
- KEK는 사용자가 입력한 패스워드와 솔트를 조합하여 생성합니다.
(3) KEK 폐기
- 세션 키를 암호화한 후, KEK는 메모리에서 삭제하여 남기지 않습니다.
- KEK는 패스워드와 솔트를 사용해 언제든지 다시 복원할 수 있기 때문에 저장할 필요가 없습니다.
- 이 과정은 키 관리의 보안성을 높이기 위해 필수적입니다.
(4) 복호화를 위한 KEK 복원
- 세션 키가 필요할 때, 사용자가 입력한 패스워드와 솔트를 조합하여 KEK를 복원합니다.
- 복원된 KEK를 사용해 암호화된 세션 키를 복호화합니다:
SessionKey = Decrypt(KEK, EncryptedSessionKey)
예시
1. 데이터 암호화
- 세션 키 생성:
- 난수를 이용해 세션 키(예: 0x1A2B3C4D)를 생성.
- KEK 생성:
- 사용자가 입력한 패스워드(예: "MySecretPassword")와 솔트(예: 0x5D6E7F8G)를 사용해 KEK 생성.
- 세션 키 암호화:
- Encrypt(KEK, SessionKey)로 세션 키 암호화(결과: EncryptedSessionKey).
- 저장:
- 암호화된 세션 키(EncryptedSessionKey)와 솔트를 안전한 장소에 저장.
- KEK는 메모리에서 삭제.
2. 데이터 복호화
- 사용자가 패스워드 입력.
- 솔트와 입력한 패스워드로 KEK 복원.
- 복원된 KEK를 사용해 암호화된 세션 키를 복호화:
- Decrypt(KEK, EncryptedSessionKey) → 원래의 세션 키 복원.
- 복원된 세션 키로 데이터를 복호화.
왜 이런 과정을 사용하는가?
보안 강화
- 세션 키 보호:
- 세션 키는 데이터 암호화의 핵심이므로, 이를 직접 저장하지 않고 KEK로 암호화하여 안전하게 보관.
- KEK 관리의 보안성:
- KEK를 직접 저장하지 않고, 패스워드와 솔트로부터 동적으로 생성하여, 공격자가 KEK를 추출하기 어렵게 만듦.
- 패스워드 기반 보안:
- 사용자는 자신의 패스워드와 솔트만으로 KEK를 복원할 수 있어 편리하면서도 안전하게 키를 관리할 수 있음.
- 세션 키 생성:
- 복원된 KEK를 사용해 암호화된 세션 키를 복호화합니다: