암호화를 진행하는 서비스 코드 파일을 보면 꼬박꼬박 등장하는 두 단어에 대해서 알아보자.
저 둘은 왜 자꾸 암호 관련 파일에 나타나는 건가요
암호화된 데이터는 바이너리 형태로 존재하게 된다. 이 때 네트워크나 텍스트 기반 시스템에서 전달하기 위해서 인코딩이 필요하다. (Base54 인코딩 : 바이너리 데이터를 문자열로 변환하는 것)
예를 들자면, AES 암호화를 한 후에 결과를 Base64로 인코딩해서 JSON 응답에 담는다.
Q : 그러면 인코딩을 하면 보안 기능이 추가되나요?
A : 아니요. 그냥 인간이 읽을 수 없는 형태가 될 뿐입니다.
그러면 보안 기능은 어디에 있어요?
IV (Initialization Vector)
블록 암호 알고리즘에서는 암호화 키를 사용한다.
계속 같은 키를 사용하니까 걱정되겠지?
그래서 IV를 쓴다. 같은 키로 데이터를 암호화해도 매번 다른 결과를 만들어내기 위한 값이 IV다.
암호화 결과의 무작위성을 부여해서 패턴 분석을 어렵게 만든다.
일반적으로 암호화 결과와 함께 전달되며, 복호화 시에도 사용되어야 한다. (예시: aEFadfa324ADF:adfase) 에서 ":" 뒷부분이 IV키값인 모양이다.
저 둘에겐 공통점이 있는데 바로
암호화, 데이터 처리 과정에서 사용된다는 것이다.
그렇다면 각자 다른 점도 있겠지 그건 바로
Base64 인코딩 | IV | |
목적 | 바이너리 데이터를 문자열로 변환 | 암호화 결과를 매번 다르게 만들기 위한 초기값 |
보안 목적 | 없음 (보안과 무관) | 있음 (보안성 향상 목적) |
복호화 가능성 | 가능 (Base64 디코딩으로 복원) | 복원 불가능 (단순히 초기값일 뿐 의미 없음) |
암호화 알고리즘과 관계 | 없음 | 있음 (CBC, GCM 등에서 필수 요소) |
예시 | 이메일 첨부 파일, JWT, 인증 토큰 등 | AES-CBC, AES-GCM 같은 블록 암호에서 사용 |
간단한 암호화 예시
1. 평문을 준비 → "my password"
2. 암호화 전에 IV 생성 → "randomIV12345678"
3. AES 알고리즘으로 암호화 (키 + IV 사용)
4. 암호화된 바이너리를 Base64로 인코딩 → "YWJjZGVmZ2hpamts..."
'【 개발 이야기 】' 카테고리의 다른 글
[spring] web client 공식 문서 번역 (1) | 2025.05.08 |
---|---|
[kotlin] inline 함수란 뭘까... (1) | 2025.04.29 |
[intelliJ] kotlin.stdlib cannot be found in the module graph (0) | 2025.04.17 |
[kotlin] corountine context는 뭔가... (0) | 2025.04.14 |
[kotlin] 프로세스, 스레드, 코루틴 (0) | 2025.04.14 |