← ALL ENTRIES SECURITY 2026.03.28 3 MIN READ
암복호화
#CS#암복호화#암호화#복호화
단방향 암호화 (해시)
- 복호화가 불가능 — 원문을 알아낼 수 있는 역함수가 존재하지 않음
- 데이터가 유출되어도 원문 복구가 어려워 패스워드 등 원문 복원이 필요 없는 경우에 사용
- 같은 입력은 항상 같은 출력을 생성 (결정적 함수)
대표 알고리즘
| 알고리즘 | 출력 길이 | 비고 |
|---|
| MD5 | 128bit | 충돌 취약점 발견, 보안 용도 비권장 |
| SHA-1 | 160bit | 충돌 취약점 발견, 보안 용도 비권장 |
| SHA-256 | 256bit | 현재 널리 사용되는 표준 |
| SHA-512 | 512bit | SHA-256보다 긴 해시 필요 시 사용 |
취약점: 레인보우 테이블
- 자주 쓰이는 평문(비밀번호 등)의 해시값을 미리 계산해 놓은 테이블
- 해시값만 탈취하면 테이블에서 역으로 원문을 찾아낼 수 있음
대응: Salt
- 해시 전에 랜덤 문자열(Salt) 을 평문에 덧붙여서 해시
- 같은 비밀번호라도 Salt가 다르면 해시값이 달라지므로 레인보우 테이블 무력화
- Salt는 해시값과 함께 저장 (비밀일 필요 없음, 유일하면 됨)
bcrypt
- 패스워드 해싱에 특화된 알고리즘
- 해시할 때마다 랜덤 Salt를 자동 생성하여 결과값에 포함시킴
- 따라서 같은 비밀번호를 저장해도 매번 다른 해시값이 생성됨
- Salt는 유저마다 달라야 의미가 있음 — 동일 Salt를 쓰면 레인보우 테이블을 다시 만들 수 있으므로 무의미
- cost factor(반복 횟수)를 설정할 수 있어 하드웨어가 발전해도 연산 비용을 높여 brute force 방어 가능
- 결과값 구조:
$2b$[cost]$[22자리 Salt][31자리 해시]
- 예:
$2b$12$WApznUPhDubN0oeveSXHru.aTi0MUsMPmSADfMi6YNXBsLFLOP3u6
- 비밀번호 검증 시: 저장된 해시에서 Salt를 꺼내고, 입력값에 같은 Salt를 적용해 해시 비교
💡 TIP 다른 패스워드 전용 해시 함수
- scrypt: bcrypt + 메모리 비용 추가 (GPU 공격 방어)
- Argon2: 현재 가장 권장되는 알고리즘, 시간/메모리/병렬도 모두 조절 가능
양방향 암호화
- 복호화가 가능 — 키를 이용해 암호문을 원문으로 복원
- 주민번호, 카드번호 등 비식별화 처리가 필요하지만 복원도 필요한 데이터에 사용
대칭키 암호화
- 하나의 키로 암호화와 복호화를 모두 수행
- 속도가 빠르고 대량 데이터 처리에 적합
- 키를 안전하게 공유하는 것이 핵심 과제
대표 알고리즘
| 알고리즘 | 키 길이 | 비고 |
|---|
| AES-128 | 128bit | 현재 표준, 속도와 보안 균형 |
| AES-256 | 256bit | 더 높은 보안 강도 |
| DES | 56bit | 취약, 현재 사용 비권장 |
| 3DES | 168bit | DES 보완, AES로 대체 추세 |
블록 암호 운용 모드
- ECB (Electronic Codebook): 블록 단위로 독립 암호화. 같은 평문 블록이 같은 암호문을 생성하므로 패턴이 노출되는 취약점이 있음
- CBC (Cipher Block Chaining): 이전 암호문 블록을 다음 블록 암호화에 사용. 첫 블록은 IV(초기화 벡터) 를 사용
- GCM (Galois/Counter Mode): 암호화 + 무결성 검증을 동시에 제공. 현재 가장 권장되는 모드
IV (Initialization Vector)
- 같은 키 + 같은 평문이라도 매번 다른 암호문을 만들기 위한 랜덤 값
- 암호화할 때마다 새로운 IV를 생성해야 함
- IV는 암호문 앞에 붙여서 함께 저장하며, 복호화 시 이 IV를 읽어서 사용
- IV 자체는 비밀이 아님 (공개되어도 키 없이는 복호화 불가)
비대칭키 암호화
- 공개키(Public Key) 로 암호화, 개인키(Private Key) 로 복호화
- 키 교환 문제를 해결하지만 대칭키보다 속도가 느림
- 실무에서는 대칭키를 비대칭키로 암호화해서 전달하는 하이브리드 방식 사용 (ex. HTTPS/TLS)
대표 알고리즘
| 알고리즘 | 비고 |
|---|
| RSA | 가장 널리 사용, 키 길이 2048bit 이상 권장 |
| ECC | RSA보다 짧은 키로 동등한 보안 강도 제공 |
활용
- HTTPS/TLS: 비대칭키로 대칭키를 교환한 뒤, 실제 통신은 대칭키로 수행
- 전자서명: 개인키로 서명, 공개키로 검증 (암호화와 반대 방향)
- SSH: 서버 인증 및 키 교환에 사용