암호화란?
데이터를 보호하기 위한 기술로 원래 내용을 알아볼 수 없도록 바꾸는 과정이다.
예를 들어, 우리가 회원가입할 때 비밀번호로 단순히 숫자 1234라고 정한다고해도,
실제 데이터베이스에는 $10$OcUXtdAMC/KC8nYuO/raeOeVYj6/Enjx7lGR52fJPX4LGnVbAqobq 이런 문자로 저장된다.
이때 암호화 전의 원래 데이터인 1234를 평문,
데이터베이스에 저렇게 저장된, 즉 암호화된 데이터를 암호문이라고 한다.
이때 평문->암호문으로 변환하는 것을 암호화 한다라고 말하고,
암호문->평문으로 복원시키는 것을 복호화 한다라고 말한다.
암호화에는 2가지 방식이 있다
- 단방향 암호화 (해시 / 복호화 불가능)
- SHA-256,bcrypt 등
- 양방향 암호화 (복호화 가능)
- 대칭키 암호화
- 비대칭키 암호화
1.단방향 암호화
어떤 입력값이 들어오면 고정된 길이의 문자열로 바꾸고 , 절대 원래 값으로 되돌릴 수 없는 방식(복호화가 불가능한 방)이며
해시 함수라는 것을 사용해 암호화 한다.
내가 1234라고 입력하든 1234567이라고 입력하든 입력된 문자열의 길이가 다르더라도 해시된 값은 같은 문자열의 길이를 가진다.
이 해시함수로 대표적으로 사용되는 함수가 SHA-256, bcrypt다.
해시라는 것은 원래 엄청 다지다.. 라는 뜻을 가진다. 그래서 해시함수는 기존의 입력값을 원본으로 돌아갈 수 없을 만큼 수학적으로 다진다. 입력값을 0과 1로된 이진수로 변환하고, 0과1의 조합으로 길게 늘어지게 된 값을 일정 블록으로 나누고 그 안에서 다시 온갖 비트연산을 수십번 반복한다. 그 결과 입력값의 구조나 규칙을 완전히 없애버리고 원래 상태로 돌아갈 수 없는 마치 믹서기로 다진 고기처럼 해시되는 것이다.

그래서 복호화가 불가능하다.
그렇다면 우리가 사용자의 비밀번호를 이 해시함수를 사용해서 암호화하여 데이터베이스에 저장하면
다음번에 사용자가 로그인할 때, 데이터베이스에 저장된 해시값을 원래의 입력값으로 되돌릴 수가 없는데 어떻게 비밀번호가 맞는지 아닌지 판단하는 걸까?
그것은 사용자가 처음 회원가입할 때 입력한 비밀번호를 암호화하는데 사용했던 동일한 해시함수를 가지고,
다시 사용자가 비밀번호를 입력할때마다 그 비밀번호를 암호화시킨다.
그런 다음, 데이터베이스에 암호화된 이전의 값과 똑같은지를 비교하면 사용자는 제대로 된 비밀번호를 입력하게 된 것이다.
이것은 입력값이 동일하면 해시값도 항상 동일하게 나오는 원리를 이용한 것이다.
그런데 여기서 문제가 하나 생긴다.
바로 해커가 이 원리를 역이용하는 것이다.
엄청나게 많은 문자열에 대한 해시값을 테이블에 따로 저장해두고(이를 레인보우 테이블이라고 한다)

해커가 DB에서 사용자의 암호화된 비밀번호 해시값을 탈취하면 그 해시값을 자신의 레인보우 테이블에 검색하고
해시값이 일치하면 원래 비밀번호를 알 수 있게 되는 것이다.
Salt
:해시하기 전에 비밀번호에 랜덤한 값을 덧붙이는 기술
그래서 이 공격을 무효화 시키기 위해 나온 것이 salt다.
예를 들어, 사용자가 1234라는 비밀번호로 회원가입을 한다면,
우리 서버에서 1234 앞에 아무 문자열. 랜덤한 x79b! 와 같은 문자열(salt)을 생성하고 1234앞에 붙여 암호화하는 것이다.
(마치 소금을 치듯이... 랜덤한 문자열을 붙이는 것이다.)
거기에다가 각 유저마다 각기 다른 salt를 적용하면 해커 입장에서는 그 모든 salt까지 고려하여 레인보우 테이블을 만들 수가 없으므로 해커의 공격을 무력화시킬 수 있는 것이다.
(이때 각 유저마다 적용한 salt값을 디비에 따로 저장해놔야 다음번에 사용자가 입력했을 때 비밀번호 비교가 가능해진다. 그럼에도 불구하고 해커는 수많은 salt에 대해 대비할 수 없으므로 레인보우 테이블은 무력화될 수 있는 것이다)
그래도 해커는 수십억 개의 비밀번호를 마구 대입하여 공격하는 브루트-포스를 시도할 수 있다.
그래서 해시함수 중에서도 해시값을 만드는데 엄청나게 복잡하게 하여 일부러 느리게 암호화 하도록 하여 브루트 포스를 사실상 힘들게 하기도 한다. 그것이 대표적으로 bcrypt 해시 알고리즘이다.
그래서 비밀번호를 암호화 하는 해시 알고리즘으로는 주로 SHA256보다는 bcrypt 알고리즘으로 많이 추천한다.
자바에서 PasswordEncoder.encode() 메서드를 사용해서 비밀번호를 암호화할 수 있는데, 이 bycrypt 알고리즘을 사용하고 또 각각의 유저마다 내부적으로 다른 salt값을 적용한 것이다.
2.양방향 암호화
단방향 암호화는 비밀번호처럼 비교만 하면 될 때 사용하는 암호화다.
다시 복원해서 사용할 정보라면 복호화가 가능해야한다. 이때 사용하는 것이 양방향 암호화다.(암호화도 가능하고 복호화도 가능. 즉 양뱡향이 가능)
2-1.비대칭키 암호화
비대칭키는 공개키와 개인키라는 2개의 키를 이용하는 것이다.
공개키라는 것은 공개해도 되는 것이고 개인키는 절대 숨겨야하는 것이다.
그리고 이 두 키는 수학적으로 연결되어있다.
공개키로 암호화한 것은 개인키로만 복호화가 가능하고, 개인키로 서명한 것은 공개키로 검증이 가능하도록 연결되어있다.
예를 들어, 내가 은행 사이트에 접속한다고 해보자.
이때 은행 사이트에 접속해서 사용을 하려는데 내 주민등록번호나, 카드번호 같은 민감한 정보를 서버에 전송해야하는 상황이다.
먼저, 내가 브라우저 주소창에 url을 입력에 서버에 접속 요청을 보내면 서버는 나에게 공개키를 SSL 인증서에 담아 보낸다.
(우리가 HTTPS에 접속하는 순간 SSL인증서라는 것을 받게 된다. 그래서 HTTP보다 HTTPS가 안전한 것이다)
그러면 나는 이 공개키로 주민등록번호나 카드번호를 암호화해서 보낸다. 그러면 서버는 서버가 가지고 있는 개인키로 복호화하여 사용하는 것이다.
다시 말해서, 서버가 보낸 공개키로 암호화하면 그걸 풀 수 있는 것은 공개키와 연결된 서버가 가지고 있는 비밀키만이 가능한 것이다. 그래서 공개키는 이거를 이용해서 암호화하라는 것이니까 사실상 공개적으로 유출되도 전혀 문제가 없다.
그리고 이 공개키로 암호화면 연결된 개인키만이 복호화할 수 있으니 암호화 된 데이터를 중간에 해커가 가로채도 개인키를 가지고 있지 않으니 복호화가 불가능한 것이다.
대표적인 것이 RSA 알고리즘이다.
RSA는 곱하기는 쉽고, 나누기는 어려운 원리를 이용한 암호화라고 한다. 이 원리를 이용해 수학적으로 연결된 공개키과 개인키를 만들어내는 것이다.
2-2.대칭키 암호화
대칭키 암호화는 하나의 키로 암호화도 하고 복호화도 하는 방식이다. 즉 하나의 열쇠로 자물쇠를 잠그고 풀 수 있는 방식인 것이다.
그래서 이 대칭키 암호화 같은 경우에는 키가 유출되면 바로 보안에 위협이된다.
그럼에도 불구하고 암호화 속도가 빠르다는 장점이 있다.
그래서 실제로는 속도가 빠른 대칭키 암호화와 비대칭키 암호화를 같이 사용한다.
위에서, HTTPS에 접속하면 서버로부터 공개키를 받는다고 했는데 그 전에 접속한 사람이 무작위로 대칭키를 만든다.
그리고 서버로부터 받은 공개키로 그 대칭키를 암호화한다. 그러면 서버만이 그 공개키와 연결된 비밀키를 가지고 있으므로 그 대칭키를 알 수 있게 되는 것이다. 그래서 사용자는 대칭키로 데이터를 빠르게 암호화하여 서버에 전달하면 서버만이 그 대칭키로 빠르게 복호화하여 데이터를 사용한다.
암호화와 복호화에 같은 키를 사용하는 대칭키카 유출되면 보안이 무력화된다는 단점을
대칭키를 공개키로 암호화하여 서버만이 비밀키로 그 대칭키를 다시 알 수 있게하는 식으로 보완한 것이다.
그러면 사용자와 서버는 대칭키 암호화를 사용하여 안전하면서도 빠르게 데이터를 주고 받을 수 있게 되는 것이다.
대표적인 대칭키 알고리즘이 AES다. 주로 HTTPS로 웹에서 요청과 응답하는 데이터를 암호화하거나 파일 암호화등에 사용된다.
'네트워크' 카테고리의 다른 글
| nginx 설정 알아보기 (0) | 2025.11.10 |
|---|---|
| [네트워크]VPN이란? (+공개망,사설망,터널링) (3) | 2025.08.24 |
| [VM웨어] 내 컴퓨터에서 VM웨어 내 리눅스로 파일 전송하기(SSH,SCP프로토콜) (6) | 2025.08.21 |
| 가상화 관련 용어정리(+가상화,하이퍼바이저,VM,VDI 등) (2) | 2025.08.18 |
| [네트워크] IP주소와 MAC주소 (4) | 2025.08.06 |