암호학
고친 사람 github-actions[bot]
암호학은 훔쳐보거나 조작하려는 상대가 있어도 정보를 지키는 방법을 연구합니다. 수학 계산으로 자물쇠와 확인 도장을 만드는 분야라고 보면 됩니다. 백엔드가 쓰는 보안 장치 대부분이 이 분야가 만든 부품을 조립해서 돌아갑니다.
쉽고 빠른 이해
암호학은 방해꾼이 있어도 데이터를 지키는 방법을 만드는 분야입니다. 로그인할 때 비밀번호가 지나가는 공유기의 주인도 그 비밀번호를 못 읽게 해 주는 것이 이 분야의 결과물입니다.
이게 없으면 데이터가 지나가는 장비를 가진 사람은 누구나 내용을 읽고 몰래 고칠 수 있습니다.
어떻게 도나:
- 계산 절차는 공개하고, 비밀은 키라는 작은 값 하나에만 둡니다
- 키 없이 풀려면 너무 오래 걸리는 계산으로 잠그고, 바뀌면 알아챌 수 있게 만듭니다
- 잠그는 부품과 바뀐 것을 알아채는 부품을 조립해 통신 규칙을 만듭니다
대가도 있습니다. 계산 시간이 들고, 지킬 비밀이 키로 옮겨 갑니다. 부품을 잘못 조립하면 수학이 멀쩡해도 뚫립니다.
읽히면 안 되는 데이터는 잠급니다. 몰래 바뀌면 안 되는 데이터에는 바뀐 것을 알아채는 값을 붙입니다. 누구에게 무엇을 보여 줄지 정하는 권한 판단은 암호학이 맡지 않습니다.
상세
이 절은 암호학을 차례로 봅니다. 먼저 누구를 상대로 무엇을 지키려 하는지 봅니다. 다음은 그 일이 기대는 원칙과 계산, 부품을 조립하는 방식과 조립이 틀려 뚫리는 곳입니다. 마지막은 백엔드 개발자가 이 분야를 만나는 때입니다.
예로는 브라우저가 서버로 보내는 로그인 요청 하나를 계속 씁니다. 그 요청에는 아이디와 비밀번호가 담겨 있습니다. 요청은 서버에 닿기 전에 공유기와 통신사 장비를 여러 대 지나갑니다.
일부러 방해하는 상대
보통의 소프트웨어는 우연한 실수와 고장을 견디도록 만듭니다. 네트워크에서 비트 몇 개가 뒤집히거나 디스크 한 조각이 망가지는 일입니다. 이런 일은 아무 의도 없이 무작위로 일어납니다.
암호학은 다른 상대를 가정합니다. 결과를 지켜보다가 가장 아픈 곳을 골라 찌르는 사람입니다. 이 문서는 이 상대를 공격자라고 부릅니다.
둘의 차이는 체크섬에서 드러납니다. 체크섬은 데이터에서 짧은 값을 계산해 붙여 두는 방법입니다. 받는 쪽은 다시 계산해 맞춰 봅니다. 우연히 뒤집힌 비트는 이 대조에서 걸립니다.
공격자 앞에서는 이 방법이 통하지 않습니다. 공격자는 내용을 고친 뒤 체크섬도 새로 계산해 붙입니다. 받는 쪽은 아무것도 눈치채지 못합니다.
키에만 두는 비밀
암호 체계는 두 가지로 이뤄집니다. 정해진 계산 절차인 암호 알고리즘과, 그 절차에 함께 넣는 비밀 값인 키입니다. 같은 절차라도 키가 다르면 전혀 다른 결과가 나옵니다.
암호학은 절차를 공개하고 키만 숨기는 쪽을 택합니다. 공격자가 절차를 다 안다고 가정해도 키를 모르면 못 깨야 쓸 수 있는 암호로 칩니다. 케르크호프스 원칙은 바로 이 원칙입니다.
절차를 숨기지 않는 이유는 둘입니다. 숨긴 절차는 만든 사람 말고는 아무도 두들겨 보지 못합니다. 공개된 절차는 많은 연구자가 오래 공격해 봅니다. 그래도 버틴 것만 표준으로 남습니다.
암호의 약점을 찾는 이 일이 암호 분석입니다. 암호학 안에서 암호를 설계하는 쪽과 짝을 이루는 방향입니다. 새 알고리즘은 암호 분석을 오래 견딘 뒤에야 쓸 만하다고 인정받습니다.
둘째로, 절차가 새면 체계 전체를 갈아야 합니다. 키가 새면 키만 바꾸면 됩니다. 비밀을 작은 값 하나로 몰아 두면 지키기도 바꾸기도 쉬워집니다.
모호함을 통한 보안은 반대로 절차를 숨겨서 지키려는 방식입니다. 암호학은 이것을 보호 수단으로 치지 않습니다.
지키려는 네 성질
로그인 요청을 노리는 방법은 하나가 아닙니다. 공격자는 요청에 담긴 비밀번호를 읽으려 할 수 있습니다. 요청을 가로채 내용을 바꿀 수도 있습니다. 서버인 척 가짜 응답을 돌려보낼 수도 있습니다.
암호학은 이 위협들을 네 가지 성질로 나눠 따로 지킵니다. 성질마다 쓰는 부품이 다릅니다. 표에 나올 부품 셋을 먼저 하나씩 봅니다.
암호화는 데이터를 키가 없으면 못 읽는 꼴로 바꾸는 일입니다. 이 문서에서 「잠근다」는 암호화한다는 뜻입니다. 로그인 요청을 잠가 보내면 공유기 주인은 알아볼 수 없는 바이트만 봅니다.
메시지 인증 코드는 메시지와 키로 계산해 메시지에 붙이는 짧은 값입니다. 받는 쪽은 같은 키로 다시 계산해 맞춰 봅니다. 공격자는 키가 없어서 내용을 고친 뒤 이 값을 새로 계산해 붙이지 못합니다. 체크섬과 갈리는 점이 바로 이것입니다.
전자 서명도 메시지에 붙여 바뀌지 않았음을 확인하는 값입니다. 여기에 더해 누가 만들었는지를 남에게도 보여 줄 수 있습니다. 그 차이는 표 아래에서 따로 봅니다.
| 성질 | 이게 없으면 벌어지는 일 | 주로 쓰는 부품 |
|---|---|---|
| 기밀성 | 허락받지 않은 쪽이 내용을 읽는다 | 암호화 |
| 무결성 | 도중에 내용이 바뀌었는데 아무도 모른다 | 메시지 인증 코드 · 전자 서명 |
| 인증 | 보낸 쪽이 누구인지 속는다 | 메시지 인증 코드 · 전자 서명 |
| 부인 방지 | 보낸 쪽이 나중에 안 보냈다고 잡아뗀다 | 전자 서명 |
표의 가운데 칸은 그 성질이 없을 때 벌어지는 일입니다. 부품 하나가 네 성질을 다 주지 않습니다. 암호화한 메시지라도 누군가 몇 바이트를 뒤집어 놓을 수 있습니다. 잠겨 있다는 것만으로는 바뀌지 않았다는 보장이 없습니다. 그래서 실제 프로토콜은 부품을 여럿 겹쳐 씁니다.
메시지 인증 코드가 부인 방지 칸에 없는 이유는 키를 누가 가졌느냐에 있습니다. 메시지 인증 코드는 주고받는 두 쪽이 같은 키를 나눠 갖고 만듭니다. 그래서 둘 중 누가 만들었는지를 제삼자에게 증명하지 못합니다. 전자 서명은 서명한 쪽 혼자 가진 키로 만들기 때문에 이 증명이 됩니다.
깨려면 너무 오래 걸리는 계산
키를 모르는 공격자에게 언제나 남는 길이 하나 있습니다. 가능한 키를 하나씩 다 넣어 보는 무차별 대입 공격입니다. 키는 길이가 정해진 비트 열이라서 넣어 볼 값의 개수도 정해져 있습니다.
그래서 현대 암호학은 깰 수 없다고 약속하지 않습니다. 깨는 데 드는 계산이 너무 커서 현실에서 해낼 수 없다고 약속합니다. 키가 한 비트 길어질 때마다 넣어 볼 값은 두 배로 늘어납니다. 키 길이를 늘려 그 수를 어떤 컴퓨터로도 다 해볼 수 없을 만큼 키웁니다.
공개 키 암호는 잠그는 키와 여는 키가 한 쌍으로 따로 있는 부품입니다. 잠그는 키는 공개하고 여는 키는 혼자 쥡니다. 공개한 키에서 숨긴 키를 거꾸로 계산해 낼 수 있으면 안 됩니다. 그래서 이 부품은 한 방향으로는 쉽고 반대로는 어려운 계산에 기댑니다.
큰 소수 두 개를 곱하기는 쉽습니다. 거꾸로 그 곱만 받아서 원래 두 소수를 찾아내는 일이 소인수분해입니다. 지금까지 알려진 방법으로는 수가 커질수록 감당할 수 없이 어려워집니다. 일방향 함수는 이처럼 한쪽으로만 쉬운 계산을 통틀어 이르는 말입니다.
이 약속은 계산 능력과 공격법에 달려 있습니다. 더 영리한 공격법이 나오면 안전하다던 알고리즘도 물러납니다.
암호학적 해시 함수가 그런 예입니다. 이 부품은 아무 길이의 데이터를 짧은 값으로 줄입니다. 그 값에서 원래 데이터를 되찾기 어렵게 설계합니다. 같은 값을 내는 다른 데이터를 찾기도 어렵게 설계합니다. 체크섬은 우연한 오류만 잡으려고 만든 것이라 이런 어려움을 갖추지 않습니다.
한때 널리 쓰던 MD5(Message Digest 5)와 SHA-1(Secure Hash Algorithm 1)은 암호학적 해시 함수였습니다. 같은 값을 내는 서로 다른 두 데이터를 현실적인 계산으로 만들 수 있게 되면서 물러났습니다.
그래서 서비스는 지금 안전하다고 인정받는 알고리즘을 고릅니다. 그리고 나중에 다른 것으로 갈아 끼울 수 있게 만들어 둡니다. 이 준비가 암호 민첩성입니다.
부품과 조립
암호학의 결과물은 계층을 이룹니다. 바닥에는 풀기 어려운 계산이 있습니다. 그 위에 한 가지 일만 하는 부품이 섭니다. 부품을 조립한 절차가 다시 그 위에 섭니다. 서비스는 맨 위의 절차를 가져다 씁니다.
암호 프리미티브는 한 가지 일만 하는 기본 부품입니다. 대표 넷은 아래와 같습니다. 앞에서 본 부품에 대칭 키 암호와 난수 생성기가 더해집니다.
| 부품 | 하는 일 |
|---|---|
| 대칭 키 암호 | 같은 키 하나로 잠그고 연다 |
| 공개 키 암호 | 잠그는 키와 여는 키가 한 쌍으로 따로 있다. 하나는 공개하고 하나는 혼자 쥔다 |
| 암호학적 해시 함수 | 아무 길이의 데이터를 짧은 값으로 줄인다. 그 값에서 원래 데이터를 되찾기 어렵다 |
| 암호학적 난수 생성기 | 남이 맞힐 수 없는 무작위 값을 뽑는다. 키를 만드는 재료가 된다 |
암호 프로토콜은 부품을 정해진 순서로 조립해 목적을 이루는 절차입니다. 브라우저와 서버 사이의 연결을 지키는 TLS(Transport Layer Security, 전송 계층 보안)가 대표입니다.
TLS 는 연결 첫머리에 공개 키 암호로 서버가 진짜인지 확인합니다. 같은 단계에서 이번 연결에 쓸 대칭 키를 정합니다. 그 뒤로 오가는 본문은 그 대칭 키로 잠급니다. 로그인 요청은 이렇게 잠긴 채로 공유기를 지나갑니다.
flowchart TD
S["서비스 · 로그인 요청"] -->|기댄다| R["암호 프로토콜 · TLS"]
R -->|기댄다| P["암호 프리미티브 · 대칭 키 암호 · 공개 키 암호 · 암호학적 해시 함수 · 암호학적 난수 생성기"]
P -->|기댄다| M["풀기 어려운 계산 · 큰 수의 소인수분해"]
그림은 위에서 아래로 읽습니다. 윗단은 바로 아랫단에 기댑니다. 로그인 요청은 맨 위에 있습니다. 그 아래 세 단이 모두 버텨야 요청이 지켜집니다.
수학이 멀쩡해도 뚫리는 곳
바닥의 계산이 버텨도 그 위 계층에서 뚫릴 수 있습니다. 부품을 잘못 조립하거나 쓰는 법을 틀리면 수학은 도움이 되지 않습니다. 아래 네 줄이 백엔드 코드에서 자주 보이는 꼴입니다.
| 흔한 실수 | 무엇이 새나 |
|---|---|
| 키를 소스 코드에 적어 저장소에 올린다 | 코드를 볼 수 있는 사람 모두가 키를 갖는다 |
| 비밀번호마다 다른 무작위 값인 솔트를 안 섞고 해시한다 | 흔한 비밀번호들의 해시를 미리 계산해 둔 표인 레인보우 테이블에서 같은 값을 찾아 원래 비밀번호를 알아낸다 |
| 검증 값을 앞 글자부터 비교하다 틀린 글자에서 바로 멈춘다 | 응답 시간 차이로 맞는 글자를 하나씩 알아낸다. 타이밍 공격이다 |
java.util.Random 같은 일반 난수 함수로 비밀번호 재설정 토큰을 만든다 |
앞서 나온 값으로 다음 토큰을 맞힌다 |
네 줄 모두 수학은 멀쩡합니다. 부품을 부르는 코드가 틀렸습니다.
백엔드 개발자가 이 분야를 만나는 때
암호 부품을 직접 짜는 일은 거의 없습니다. 검증된 라이브러리를 부릅니다. 손으로 짠 암호는 테스트를 통과해도 안전하다는 뜻이 아닙니다. 테스트는 결과가 맞는지를 볼 뿐, 공격자가 틈을 찾을 수 있는지는 보지 않습니다.
개발자가 직접 정하는 것은 셋입니다.
- 지킬 성질. 읽히면 안 되는 데이터는 암호화합니다. 바뀌면 안 되는 데이터에는 메시지 인증 코드나 전자 서명을 붙입니다. 비밀번호는 암호화하지 않고 비밀번호 해싱으로 저장합니다
- 키를 두는 곳. 코드와 떼어 시크릿 관리 도구에 둡니다
- 무작위 값의 출처. 토큰과 키는 암호학적 난수 생성기에서 뽑습니다
비밀번호를 암호화하지 않는 이유는 서버도 원래 비밀번호를 알 필요가 없어서입니다. 로그인 때 들어온 비밀번호를 같은 방식으로 해시해 저장된 값과 맞춰 보면 됩니다. 되돌릴 수 있는 암호화로 저장하면 키가 샐 때 비밀번호가 전부 드러납니다.
암호를 거는 데는 대가가 있습니다. 잠그고 여는 계산에 시간이 듭니다. 지킬 비밀이 데이터에서 키로 옮겨 갑니다. 키를 흘리면 잠근 것이 소용없습니다. 키를 잃으면 자기 데이터도 못 읽습니다.
암호학이 풀지 못하는 문제도 있습니다. 통신을 아무리 잘 잠가도 서버가 권한을 확인하지 않고 아무에게나 데이터를 내주면 소용없습니다. 그 판단은 인가와 접근 제어가 맡습니다.
그래서 암호학은 보안 엔지니어링이 끌어다 쓰는 전문 분야 가운데 하나입니다. 시스템 전체를 지키는 일은 암호 말고도 권한 설계와 운영 절차와 사람의 실수까지 다룹니다.
관련 항목
암호학이 지키려는 성질
기밀성 · 무결성 · 인증 · 부인 방지 · 데이터 출처 인증
암호학이 만드는 기본 부품
암호 프리미티브 · 대칭키 암호 · 공개 키 암호 · 블록 암호 · 스트림 암호 · 암호학적 해시 함수 · 메시지 인증 코드 · HMAC · 전자 서명 · 키 교환 · 암호학적 난수 생성기 · 키 유도 함수 · 인증 암호
암호학이 기대는 수학 문제
일방향 함수 · 트랩도어 함수 · 소인수분해 · 이산 로그 문제 · 모듈러 연산 · 정수론
암호학이 내놓은 대표 알고리즘
AES · ChaCha20 · RSA · 타원 곡선 암호 · 디피-헬만 키 교환 · SHA-256 · SHA-1 · MD5 · Argon2id · bcrypt · 양자 내성 암호
암호학의 부품을 조립한 프로토콜
암호 프로토콜 · TLS · HTTPS · SSH · 종단 간 암호화 · 공개 키 기반 구조 · 인증서 · JWT · VPN
암호학이 막아야 하는 공격
암호 분석 · 무차별 대입 공격 · 중간자 공격 · 레인보우 테이블 · 타이밍 공격 · 사이드 채널 공격 · 재전송 공격 · 다운그레이드 공격 · 생일 공격
암호 체계를 세울 때 따르는 원칙
케르크호프스 원칙 · 모호함을 통한 보안 · 암호 민첩성 · 순방향 비밀성 · 위협 모델링
암호학의 결과를 서비스에서 굴리는 수단
키 · 키 관리 · 키 회전 · 키 관리 서비스 · 하드웨어 보안 모듈 · 시크릿 관리 · 봉투 암호화 · 비밀번호 해싱 · 솔트 · nonce
암호학과 헷갈리는 이웃 기법
암호화 · 해시 · 인코딩 · 체크섬 · 난독화 · 스테가노그래피
암호학이 속하는 상위 분야와 이웃 학문
보안 엔지니어링 · 컴퓨터 보안 · 정보 보안 · 정보 이론
다른 이름: cryptography · cryptology · 암호론