목적
- 암호화의 기본 개념부터 대칭키, 비대칭키 암호화, 그리고 그 응용에 대해 간단히 암호 기술의 전반적인 구조와 원리를 이해해보자.
- 키워드: 암호, 대칭키, 비대칭키, 해시, JWT
기본 개념
암호의 기본 구조와 간단한 암호화 방식, 그리고 블록 알고리즘에 대해 알아보자.
암호의 목적
- 비밀 유지
- 부인 방지(보증) ex) 공인인증서, JWT
암호의 구조
- 암호 알고리즘과 비밀키로 구성
- 알고리즘은 치환, 전치 등을 이용
시저(Caesar) 암호
- 알파벳에 n번째 숫자를 더한 알파벳으로 변환
- 여기서 암호 알고리즘은 더하기(+) 연산, 비밀키는 n값이 된다.
- 대칭키로 암복호화해 동일한 비밀키를 사용한다.
블록 알고리즘
대칭키 암호화의 기본 개념
- 평문을 블록(키 길이) 단위로 나눈 걸 블록이라 하고, 블록 단위로 연산해 암호문 생성
- 마지막 블록이 키 길이보다 짧을 수 있어 패딩을 추가한다.
- ECB(Electronic Code Book): 블록 알고리즘은 평문/암호문의 패턴이 유사해 보안상 취약하다. 이는 독립적으로 연산이 이뤄지기 때문.
- CBC(Cipher Block Chain): 이전 블록의 암호문이 다음 블록의 평문과 XOR 연산되어 암호화에 사용된다. 블록 간 체인이 연결되어 순차적으로 연산이 이뤄진다.
- IV(Initialization Vector): CBC 방식의 암호화의 경우 첫 블록에 암호화에 활용하는 값, 그러므로 블록 크기와 동일, 복호화 할 때도 필요하므로 암호문과 IV 값을 함께 전송해야 한다. 노출되어도 보안상 아무 문제 없음
해시
데이터가 변조되지 않았음(데이터 무결성)을 보증하는 값
- 해시 함수: 해시 값을 계산하는 알고리즘, SHA256/...
- 해시 값은 입력 값에 상관없이 동일한 크기
- 활용: 패스워드 인증, 파일 무결성 검증
해시 공격
- 2012년 링크드인이 SHA-1로 해시해 DB 저장
- 해커가 이를 평문 패스워드로 복원하는데 성공
- 사전에 만들어 놓은 해시 디렉토리 활용
보안 강화: Salt
- 평문에 random salt 값을 추가해 보안 강화
대칭키 암호화
구조
- 암호 알고리즘(AES/..)
- 블록(ECB/CBC/...)
- 패딩(PKCS#8/...)
- IV
해독
아래와 같은 공격이 가능하다.
해독에 걸리는 시간을 늘리는 방법
- 비밀키 길이를 늘리거나
- 암호 알고리즘 연산 속도를 늘리거나
문제: 암호키 교환 문제
- 미리 암호키가 공유되어 있어야 함
- ex) OTP(One Time Password, 현재 시간을 기반으로 암호키를 생성)
SSL에서 암호키 교환 방법
- 디피-헬만 알고리즘 활용
- 클라이언트와 서버는 TCP/IP로 통신하므로 누구나 모든 패킷을 볼 수 있음
- HTTPS를 통해 동일한 비밀키를 나눠가짐, 볼 수는 있지만 내용을 알 수 없음
비대칭키 암호화
구조
- 2개의 암호키: 비밀키와 공개키
- 전자서명
- plain-text -> private key를 이용해 hash -> encrypted hash
- 비밀키로 암호화(서명)를 하게 하여 그 사람이 했다는 걸 증명
응용
JWT(JSON Web Token)
구조
- 헤더(header): 알고리즘 방식(ex) RS256) 등
- 페이로드(payload): 원문(변조되지 않아야 하는 데이터)
- 서명: 지정한 알고리즘 방식으로 헤더와 페이로드를 해시한 후, 이를 비밀키로 암호화하고 Base64로 인코딩한 값
- 토큰을 받은 사람이 공개키로 서명을 복호화 했을 때, 헤어돠 페이로드가 일치하면 된다.
왜 Base64로 인코딩 할까?
- 전송 용이성이 큼, Base64로 인코딩 시, HTTP Header나 URL param으로 사용되기 적합함
SSL 인증서로 서버에 대한 인증
- 디피-헬만 키 교환을 시작했을 때, 서버의 인증서(공개키 포함)을 함께 전달
- 서버가 값을 보낼 때, 값에 대한 서명을 함께 만들어 상대에게 공유
- 클라이언트는 서버 인증서의 공개키로 서명을 복호화해 서버에 의해 생성된 값인지를 확인
- 클라이언트는 인증서 자체도 발급기관의 공개키를 이용해 서명 검증
정리
- 대칭키 암호화는 효율적이나 키 교환 문제가 있다.
- 이 문제를 해결하기 위해 비대칭키 암호화가 등장한다.
- 앞서 암호화의 주요 기능 중 부인 방지의 2가지 조건을 살펴보면 아래와 같다.
- 내용이 변경되지 않음(무결성) <- 해시 활용
- 그 사람이 했다는 걸 증명 <- 비대칭키 활용
- JWT는 해시, 비대칭키 암호화를 사용해 토큰의 무결성과 발급자를 검증, SSL은 대칭키, 비대칭키 암호화 모두 활용해 안전한 통신 채널을 구축
Reference