참고: Symmetric Argorithm, Asymmetric Argorithm
대칭키
(Private Key, Symmetric Key)
암호화와 복호화에 같은 키를 사용하는 알고리즘
- 매우 빠르다 > 대량의 데이터를 효율적으로 암호화하는 데 사용
- 키 배포 문제
- ex) AES : 전자 데이터의 암호화를 위해 2001년 미국 국립 표준 기술 연구소에서 설정한 표준
이 방식은 통신 장치 간에 대칭키 전달 과정에서 해킹 위험이 있다.
따라서 대칭키의 수명 주기를 적절하게 관리해야 한다.
공개키
(Public Key, Asymmetric Key)
암호화와 복호화에 사용하는 암호키를 분리한 알고리즘
- 대칭키에 비해 속도가 느리다.
- Use case:
- 디지털 서명
- 암호화된 이메일
- SSL/TLS (웹 서버와 브라우저 사이 암호화 된 연결 설정)
- 암호화폐 (합법적인 소유자만 자금을 사용할 수 있도록 비대칭 암호화 알고리즘 사용)
이 방식은 Confidentiallity(기밀성)만 보장해 줄 뿐, Integrity(무결성)나 Authenticity(인증성)는 보장해주지 못한다.
(데이터가 중간에 변경이 있었는지, 데이터를 신뢰할 수 있는지 신뢰할 수 있는 출처인지)
→ 이는 MAC이나 디지털 서명으로 해결한다.
공개키 암호화 과정
- A 가 웹 상에 공개된 B의 공개키를 이용해 평문을 암호화 > 암호화된 데이터를 B로 보낸다.
- B는 자신의 개인키로 복호화해서 평문을 확인 > 응답을 A의 공개키로 암호화해서 A로 보낸다.
- A는 자신의 개인키로 암호화된 응답문을 복호화한다.
하이브리드 방식
- 대칭키 + 공개키 암호화 방식
- 대칭키를 주고받을 때만 공개키 암호화 방식을 사용하고, 이후 데이터를 주고받을 때는 대칭키 암호화 방식으로 통신한다.
하이브리드 암호화 과정
- A가 B의 공개키로 암호화 통신에 사용할 대칭키를 암호화 > B에게 보낸다
- B는 받은 데이터를 자신의 개인키로 복호화해서 대칭키를 얻는다.
- B는 얻은 대칭키로 A에게 보낼 평문을 암호화해서 A에게 보낸다.
- A는 자신의 대칭키로 암호문을 복호화
→ 이후 A와 B 사이 통신에 해당 대칭키를 사용해서 암호화, 복호화를 수행한다.
💡 메시지 인증 코드, MAC (Message Authentication Code)
메시지 인증을 제공하는 대칭키 암호화 기술
- 메시지 인증을 보장하기 위해 메시지와 함께 전송되는 암호화된 체크섬
- 메시지 발신자와 수신자가 대칭키를 공유한다.
- 발신자는 MAC 알고리즘을 사용해 메시지와 개인키로 MAC 값을 생성 > MAC과 함께 메시지를 전송
- 수신자는 수신한 메시지와 대칭키를 MAC 알고리즘에 적용해 다시 MAC 값을 계산
- 계산한 MAC 값과 수신한 MAC 값이 같은지 확인 > 일치하면 수신자는 메시지를 수락, 일치하지 않으면 메시지를 수락하지 않음
💡 디지털 서명 (Digital Signature)
전자 메일 메시지, 전자 문서와 같은 디지털 정보에 대한 암호화된 전자 인증 스탬프
- 일반적으로 해싱, 서명, 검증 세 가지 알고리즘으로 이뤄진 전자 서명의 일종
- 발신자 인증, 무결성, 부인 방지를 보장한다.
(데이터가 전송되는 동안 변경 되지 않았음, 데이터를 전송하는 발신자에 대한 인증)
- 개인키와 공개키 생성
- 보내야 할 데이터를 해시 알고리즘으로 암호화해서 개인키, 공개키를 생성한다.
- 서명
- 데이터에 발신자의 개인키를 포함시킴으로써 서명한다.
- 발신자는 수신자에게 개인키에 부합하는 공개키를 데이터를 함께 보낸다.
- 검증
- 수신자는 발신자가 보낸 공개키를 통해 디지털 서명의 유효성을 확인한다.
'CS' 카테고리의 다른 글
[CS 스터디] Blocking & Non-Blocking I/O (0) | 2023.07.10 |
---|---|
[CS 스터디] Blocking, Non-blocking & Synchronous, Asynchronous (0) | 2023.07.10 |
[CS 스터디] HTTP, HTTPS (0) | 2023.06.30 |
[Java] Stream API (0) | 2023.06.26 |
[Java] 문자 -> 문자열 변환하기, 문자열 내 특정 문자 제거하기 replaceAll() (0) | 2023.06.26 |