업무를 진행하며 암호화 알고리즘으로 어떤 것을 선택해야 할지 판단 기준이 모호하고 어려운 부분이 있어 이부분에 대해 정리하고 넘어가려고 한다.
1. AES (Advanced Encryption Standard)
→ 대칭키 암호화 알고리즘

- 암호화·복호화에 동일한 키를 사용한다.
- 데이터를 숨기는 용도(기밀성).
- 블록 단위로 데이터를 암호화한다. ( 128bit, 192bit, 256bit 키 지원 )
- 키 길이가 길수록 안전하지만 연산량이 약간 증가
- AES-256은 현재 전 세계적으로 가장 강력한 표준 대칭키 암호
1.1 동작 방식(운용 모드)
블록암호라 “어떻게 묶어서 암호화할지” 모드가 중요함.
- ECB: 블록 반복 노출 → 보안 취약 (실무에서 금지)
- CBC: 초기화 벡터(IV) 필요, 패딩 필요 (AES/CBC/PKCS5Padding)
- GCM: 암호 + 무결성 검증까지 제공 → 최신 표준
- CTR: 패딩 불필요, 병렬처리 빠름
1.2 장단점
✔ 장점
- 매우 빠름
- 대용량 데이터 처리 적합
- 하드웨어 가속(AES-NI) 지원으로 성능 뛰어남
✔ 단점
- 키 관리가 어렵다(같은 키를 양쪽 모두 안전하게 보관해야 함)
- 키가 유출되면 복호화 가능 → 기밀성 완전히 붕괴
2. SHA (Secure Hash Algorithm)
→ 해시 함수 / 단방향 함수

- 입력 데이터를 고정 길이의 해시값으로 변환
- 절대 복호화 불가능(단방향)
→ 암호가 아니라 지문 만드는 방식, 역함수가 없어 복호화 불가능
→ 레인보우 테이블(Rainbow Table) - 데이터가 바뀌었는지 확인(무결성)
- 비밀번호 저장(평문 대신 해시 저장)
- 디지털 서명·토큰 생성(JWT 등)
2.1 해시 함수 종류
- SHA-1 (취약) — 사용 금지
- SHA-256 — 가장 널리 사용되는 표준
- SHA-384, SHA-512 — 더 긴 해시값 제공
2.2 해시 함수 특성
- 동일 입력 → 항상 동일 해시값 출력 (Deterministic)
- 입력 조금만 바뀌어도 완전히 다른 값 출력 (Avalanche 효과)
- 해시값으로 원래 데이터 복원 불가
- 충돌이 발생하기 어려움
2.3 장단점
- 빠르고 단순
- 데이터 무결성 체크에 최적
- 저장 공간 적게 사용(고정 길이)
- 암호화가 아니므로 데이터 보호 불가능
- 단독으로 비밀번호 보호에 쓰면 위험 → 단순 SHA-256(password) 금지
→ 반드시 salt + 반복 횟수 필요 (PBKDF2, bcrypt, scrypt)
2.4 Salt
?? **Salt(솔트)**는 해시(Hash) 과정에 섞어 넣는 임의의 랜덤 문자열.
SHA-256 같은 해시는 같은 입력 → 같은 출력이라는 특징 때문에, 보안에서 취약점이 생기는데, 이를 막기 위한 필수 요소가 바로 salt
- Salt가 추가되면 이렇게 바뀐다. (즉 기존의 hash값으로 찾는게 불가능해진다. 미리 계산된 값으로 추적 불가능)
SHA256("123456" + salt1) → 8fa1...
SHA256("123456" + salt2) → c21e...
1) 사용자별로 다른 salt를 사용, salt는 각 계정마다 랜덤 생성하는 게 원칙.
2) salt는 비밀키가 아니며, 평문으로 DB에 저장해도 괜찮다.
salt의 목적은 비밀번호 패턴을 깨뜨리는 것이지 감추는 게 아님.
3) 길고 예측불가능해야 한다. (8~16바이트 이상 랜덤값 사용.)
4) 반복 연산(PBKDF2/bcrypt/argon2)과 함께 써야 더욱 안전
SHA-256 단독 + salt → 여전히 빠르기 때문에 공격자도 빨리 계산 가능
➡ 그래서 bcrypt / PBKDF2 / Argon2 같은 “느린 해시 함수”를 사용해야 안전함.
비교 요약
| 구분 | AES | SHA |
| 유형 | 대칭키 암호화 | 해시 함수 |
| 목적 | 데이터 기밀성 | 무결성, 비밀번호 해싱 |
| 키 존재 | 있음(암호화·복호화 동일 키) | 없음 |
| 역변환 | 가능 | 불가능 |
| 출력 길이 | 입력 크기와 동일(암호문) | 고정 크기(예: 256bit) |
| 사용 예 | 파일 암호화, TLS, DB 암호화 | JWT, 비밀번호 저장, 체크섬 |
3. 언제 AES, 언제 SHA?
🔸 AES 사용해야 할 상황
- DB에 중요한 값을 암호화해야 함
- 통신 데이터를 암호화해야 함
- 파일을 저장하는데 외부 유출 위험이 있음
➡ 복호화가 필요한 데이터
🔸 SHA 사용해야 할 상황
- 비밀번호 저장
- 데이터가 변경되었는지 검증
- 토큰 서명(JWT의 Signature 부분)
➡ 복호화가 필요 없는 데이터
참고, Spring Security 표준 암호화 방식인 BCrypt 도 단방향 암호화, 해시 방식.
🔸 Spring Security 기본 PasswordEncoder는 BCryptPasswordEncoder
장점
- 자동 솔팅(salt 포함)
- 비용(cost factor)로 연산 난이도 조절 가능
- 무차별 대입 공격에 강함
- Java/Spring 진영에서 가장 널리 사용됨
Spring Security 5+에서는 PasswordEncoderFactories.createDelegatingPasswordEncoder() 의 기본 알고리즘이 {bcrypt} 로 되어 있음 → 표준 채택이라는 의미.
'IT기술 > Hello기술' 카테고리의 다른 글
| REST API 규칙, API란 무엇인가요? (0) | 2024.02.09 |
|---|---|
| [Kafka] 카프카 - 주키퍼(ZooKeeper)란? (0) | 2023.08.03 |
| [apache] camel 웹 교제 (0) | 2023.07.13 |
| Tailwind CSS 사용기 (0) | 2023.07.13 |
| [Python] 문자열에서 줄바꿈, 공백 제거 (0) | 2023.06.19 |