암호화 방식
암호화 방식은 크게 2가지가 있다. 단방향과 양방향 암호화가 있는데 단방향은 암호화만 가능하고 복호화가 불가능하지만 양방향은 암호화뿐만 아니라 복호화 또한 가능하다.
대칭키와 비대칭키
- 대칭키: 암호화와 복호화에 같은 키가 사용되는 방식이다.
- 비대칭키: 암호화와 복호화에 사용되는 키가 다른 방식이다.
보안의 문제
만약 양방향 암호화를 사용하고 있는데 중간에 키가 해커에 의해 갈취당한다고 생각해보자.
이 해커는 복호화 키를 이용하여 데이터 센터나 데이터의 전달 과정을 들여다보고 원하는 데이터를 탈취할 수 있다.
따라서 복호화 자체가 불가능한 단방향 암호화 방식을 비밀번호 같은 중요한 정보에 사용하는 것이다.
단방향 암호화의 한계
단방향 암호화는 해시 알고리즘을 이용해 사용되는데, 이 해시 알고리즘은 치명적인 약점이 존재한다.
해시 알고리즘의 치명적인 약점은 동일한 입력에 대해 항상 동일한 해시값을 가진다는 것이다.
이는 해시 알고리즘의 결정론적 성질을 나타내며, 레인보우 테이블 같은 여러 경우에 대한 해시값을 저장해 놓고 역으로 추론하는 것이 가능하다 (결정론적 성질을 역이용).
단방향 암호화의 한계를 극복하는 방법
해결 방안은 무작위의 값을 해시값에 추가하는 것이다. 이를 솔팅(Salting) 기법이라고 부르며, 또 다른 방식으로는 키 스트레칭(Key Stretching) 방식이 있다.
- 솔팅(Salting): 해시값에 무작위 값을 추가하여 해커가 해시값을 역으로 추론하기 어렵게 만든다.
- 키 스트레칭(Key Stretching): 암호화 과정을 여러 번 반복해서 계산하여 공격자가 해시값을 빠르게 계산하지 못하도록 한다. 해시 계산을 의도적으로 느리게 만들어 무차별 대입 공격(Brute Force Attack)을 어렵게 만든다.
Bcrypt
Bcrypt는 솔팅과 키 스트레칭 기법을 합친 방식이며, 기본적인 round 수는 10이다 (Spring Boot의 Spring Security에서 기본적으로 설정된 값).
Bcrypt의 형태는 다음과 같다:
$버전 정보 $ round수 $ 해시값+솔트
Bcrypt의 인증 절차
- 해시와 솔팅값을 같이 저장한다. 이를 DB에 저장된 비밀번호라고 생각하자.
- DB에 저장된 비밀번호와 새롭게 입력한 비밀번호를 비교하는 과정이 시작된다.
- DB에 저장된 솔팅값과 새롭게 입력한 비밀번호를 이용하여 해시값을 새롭게 생성한다.
- 이 새롭게 만들어진 해시값과 기존 DB에 존재하는 해시값이 일치한다면 비밀번호가 일치하는 것이다!
즉, Bcrypt 방식의 인증은 복호화가 아니라 비교 방식인 것이다.
'백엔드 CS 정리' 카테고리의 다른 글
JVM 내부 동작 원리 (0) | 2024.10.04 |
---|---|
JAVA에서 Final을 사용하는 이유 (0) | 2024.09.30 |
쿠키 vs 세션 vs 캐시 (1) | 2024.09.24 |