## 암호화 기본
서버와 서버, 서버와 클라 등등 여러 관계에서 안전하게 정보를 교환하기위해 여러 방식의 보안기술이 사용됨. 보안으로 이루고자 하는 세부적인 목적이 여러개 있겠으나, 핵심은 아래와 같아 보인다.
1. 메시지를 받았을때 인증된 주체에게서온 메세지인지 확인 가능해야함
2. 메시지를 받았을때 이 메시지가 변조되지 않았음이 확인 가능해야함
### 암호화 종류: 공개키와 대칭키 방식
- 공개키 방식:
여러사람과 한명이 신뢰성있는 통신을 할 수 있는 구조. 중심 인원은 비밀키를 갖고, 공개키를 발급함. 다수의 사람들이 공개키로 암호화해서 보내면 중심인원은 비밀키로 해당 메시지를 복호화하여 수신 가능. 비밀키로 암호화해서 보내면 공개키로 복호화 가능.
디지털 서명, 기밀성보장에 사용
- 대칭키 방식:
하나의 비밀키를 두사람 모두 동일하게 갖고있어야 하는 방식. 비밀키로 암호화하고 비밀키로 복호화한다.
주로 데이터의 기밀성보장에 사용
### 해싱 알고리즘: HMAC SHA256, RSA 등등..
#### HMAC SHA256(hash based message authentication code secure hash algorithm)
해시 함수와 비밀키로 특정 메시지의 인증코드를 만들어내는 알고리즘. 인증코드는 256 bit 로 만들어져서.. 결과값의 경우의수는 2^256개가 되어 매우 안전하다고 볼 수 있음. 이 알고리즘은 주로 어떤메시지를 "변조되지않았음" "인증된상대가보낸것임" 을 동시에 확인하면서 주고받고 싶을때 사용함(메시지와 그 메시지의 인증코드를 함께 보내서 인증하면 이게 가능해진다)
### "데이터를 서명한다, 디지털 서명" 의 기술적 의미
해당 내용이 믿을 수 있는 원본임을 누군가가 보장(=서명) 한다는 것. 디지털 서명은 수신자가 아래와 같은 방법을 통해, 서명자의 신뢰할 수 있는 서명이 맞는건지에 대해 확인할 수 있다.
1. signature 코드(=서명) 내용을 CA의 알려진 공개키로 복호화 한다
2. 원본 콘텐츠 내용을 해싱한 후, 위의 복호화 값과 일치하는지 확인한다
위 1,2번만 들으면 어떻게 CA가 서명한게 맞다는 보장이 되는것인지에 대하여 의아해할 수 있지만, CA가 서명을 생성하는 방식과 공개키의 원리를 이해한다면 납득할 수 있다. 아래는 CA가 디지털 서명을 만드는 과정이다.
1. CA는 원본 콘텐츠내용을 해싱하여 256 bit 등의 해싱코드를 만들어낸다
2. 해싱코드를 비밀키로 암호화하여 signature 코드(=서명) 을 만들어낸다
결론적으로, 원본 콘텐츠의 해싱코드를 CA는 비밀키로 암호화 한 것이고, 우리같은 일반 client들은 CA의 공개키로 복호화 한 것이다. 공개키 방식에서 비밀키로 암호화한것은 공개키로 복호화하여 암호화전의 내용을 만들어낼 수 있으므로 그게 원본콘텐츠의 해싱코드와 일치한다면 원본콘텐츠의 내용이 바뀌지 않았다는 사실과 이 서명값이 CA에 의해 암호화 되었다는 두가지 사실이 입증되는 원리이다.
## 위 암호화 방식을 기반으로 한 보안 기술들
### SSL/TLS(Secure SocketLayer/TransPortLayer Security)
클라이언트는 서버로부터 공개키가 포함된 증명서를 받고, 공식기관에 대조해서 해당 서버의 신원확인
신원이 확인 되었으므로 클라이언트는 그 서버와 메시지를 주고받는 것을 시작하게 됨
먼저, 앞으로의 통신에서 사용될 세션키를 클라가 임의로 만들어 서버가 준 공개키로 암호화해서 전송
이제 클라와 서버 둘다 이 세션키를 갖고있게 되며, 둘다 앞으로의 통신에서 암호화/복호화에 이 세션키를 사용
-> 중간에 HTTP가 도청당하더라도 그누구도 클라인척 할 수 없게 됨
### JWT(json web token)
헤더,페이로드,시그니처 3부분으로 나뉜다.
헤더와 페이로드는 base64인코딩된 문자열로 전송하고,
시그니처는 헤더 와 페이로드를 HMAC 암호화등의 방식으로 생성한 인증코드이다.
### SSH
접속 받고자 하는 서버가, 접속하고자 하는 서버의 공개키, ip, shell 접속 user 3가지를 알고 있어야 한다. 그래야 접속요청이 왔을때 허용된 접속자인지를 확인할 수 있다.
1. ip로 허용된 접속 네트워크주소인지 확인
2. username으로 허용된 계정인지 확인
3. 공개키를 통해 세션키를 전송하고, 세션키를 공유한 상태로 접속하고자 하는서버가 자신을 인증