4.13보안
디지털 시대의 프라이버시, 보안, 암호 기술의 원리와 중요성
TL;DR
추억의 쪽지 시험
95. 숨길 게 없다면 괜찮을까?
"어쨌든 당신에게 프라이버시란 없다. 그냥 잊고 살아라."
썬 마이크로시스템즈의 공동 창업자, 스콧 맥닐리, 1999년
디지털 기술의 발전은 삶을 훨씬 윤택하게 만들어 주었지만, 동시에 개인의 프라이버시와 보안에 큰 악영향을 주었다. 처리 성능 향상, 저장 용량과 통신 대역폭 증가가 결합되면서 여러 출처에서 개인정보를 수집, 보존하고 통합, 분석해 퍼뜨리는 일이 아주 쉬워졌다.
프라이버시(privacy)는 한 사람의 개인적 삶의 여러 측면들이 타인에게 알려지지 않도록 하는 권리와 능력이다. 내가 누구와 통신하고, 어디로 여행가고 싶어하고, 무슨 책을 읽고, 무슨 취미가 있는지는 모두 개인적인 일이며 내가 명시적으로 허락해야만 다른 사람이 알 수 있어야 한다. 이는 내가 불법적이거나 남들에게 알려지면 안되는 일을 해서 그런것이 아니라, 기본적으로 자기 생활과 습관이 타인에게 공유되지 않음을 알고 안심할 수 있어야 한다는 말이다.
보안(security)은 이 프라이버시를 지키는 일이다. 프라이버시와 온라인 보안 문제는 최신 기술을 잘 익혀두어야 대처할 수 있다.
96. 둘이서만 공유하는 비밀 키 암호 기법
암호 기법(cryptography), 즉 남이 알 수 없게 정보를 만드는 기술은 프라이버시 공격에 대한 최선의 방어책이다.
암호 기법의 기본은 다음과 같다. Alice와 Bob이 통신을 한다고 할 때, 이들은 교환하는 메시지가 혹시 이걸 들으려고 하는 Eve에게 유출되더라도 내용은 공개되지 않길 원한다. 그러기 위해 이들은 다른 사람은 모르지만 둘만 이해할 수 있게 메시지를 변형했다가 복원할 수 있는 공유된 비밀을 가지고 있어야 한다. 이 공유된 비밀을 키(key)라고 한다. 현대 컴퓨터 기반 암호화 체계에서 키는 알고리즘에 사용되는 큰 비밀 수다. 알고리즘에선 비밀 수를 모르면 복원이 불가능할 정도로 메시지의 비트를 크게 변형시킨다.
암호 기법 알고리즘을 공격하는 기법도 다양하다. 각 기호의 출현 빈도를 세는 빈도 분석은 간단한 암호를 풀 때 잘 통한다. 이것에 대비하려면 모든 기호가 유사한 비율로 사용되도록 하고, 암호화된 형태에선 분석해 낼 패턴이 없도록 만드는 알고리즘을 만들어야 한다.
또 다른 공격 기법엔 기지 평문(known plaintext) 공격과 선택 평문(chosen plaintext) 공격이 있다. 기지(=이미 아는) 평문 공격은 이전에 사용된 평문과 암호 메시지 둘을 모두 확보하여 키를 추측한다. 선택 평문 공격은 임의의 평문을 선택하고, 그 평문을 암호화된 메시지를 확보해 키를 추측하는 방식이다. 좋은 알고리즘은 이런 다양한 공격들을 모두 견딜 수 있어야 한다.
암호 기법을 사용할 땐 암호 체계가 이미 알려져 있고 적이 이를 완벽하게 이해하고 있어, 모든 보안은 키에 달려 있다고 가정해야 한다. 흔히 빠지기 쉬운 길은, 적이 우리가 쓰는 암호 체계가 어떤 것인지, 어떤 원리로 작동하는지 이해하지 못할거라고 가정하는 모호함에 의한 보안(security by obscurity)인데, 혹시나 작동하더라도 결코 오래가지 않는다.
암호 체계는 오히려 개방형 환경에서 개발하는 것이 필수적이다. 체계가 제대로 작동할지 확신하기 어렵기 때문에, 암호 체계의 취약점을 찾아내려면 가능한 한 많은 전문가의 경험이 필요하다.
비밀 키 암호 기법
오늘날 암호 체계는 근본적으로 두 개다.
첫번째는 비밀 키 암호 기법(secret-key cryptography)로, 대칭 키 암호 기법(symmetric-key cryptography)이라고도 한다. 비밀 키 암호 기법에서는 같은 비밀 키를 사용하여 메시지를 암호화하고 복호화한다. 이 비밀 키는 메시지를 교환하는 당사자들끼리만 공유한다.
알고리즘을 완전히 이해하고 있고 알고리즘에 약점이 없다고 가정하면, 이 암호를 해독하는 유일한 방법은 무차별 대입 공격(brute force attack)뿐이다. 즉, 가능한 모든 비밀 키를 시도해서 암호화에 사용된 키를 찾는 방법이다. 무차별 대입 공격은 많은 시간이 필요하다. 만약 키가 n 비트라면 키를 찾는데 드는 노력은 대략 2^n에 비례한다.
하지만, 무차별 대입이 마냥 어리석은 방법은 아니다. 공격자는 긴 키보다 짧은 키들을 먼저 시도하고, 가능성이 높아보이는 키를 먼저 시도한다. 예를 들어 'password'라던가 '12345'와 같은 키들로 사전 공격을 시도하는데, 놀랍게도 꽤 성공적인 공격 시도들인 경우가 많다고 한다.
2000년대 초반까지 가장 널리 사용된 비밀 키 알고리즘은 1970년대 초 IBM과 NSA가 개발한 DES(Data Encryption Standard, 데이터 암호화 표준)이었다. DES는 56비트 키를 이용했는데, 컴퓨팅 속도가 빨라짐에 따라 56비트는 너무 짧은 길이가 되었다.
때문에 더 긴 키를 사용하는 새로운 알고리즘이 만들어졌고, 이 중에서 가장 널리 사용되는 것이 AES(Advanced Encryption Standard, 고급 암호화 표준)다. 이 표준은 미국국립표준기술연구소(National Institute of Standards and Technology)에서 후원한 세계적인 공개 대회를 통해 개발되었다. 이 대회에선 세계 곳곳에서 알고리즘 수십 개가 제출되어 치열한 공개 테스트와 평가를 했다. 여기서 벨기에 암호학자 Joan Daemen과 Vincent Rijmen이 만든 레인달(Rijndael)이 우승해 표준이 된 것이다.
AES는 공개되어 있어 누구나 라이선스나 수수료 없이 사용할 수 있고, 128비트, 192비트, 256비트의 세 가지 키 길이를 지원한다. 만약 GPU처럼 전문화된 프로세서가 초당 10^13번(10조)의 연산을 수행한다면, GPU 100만 개로는 초당 10^19번을 수행할 수 있다. 이는 연간 약 3*10^26번이며, 2^90 정도 된다. 이 값은 2^128에 비하면 한참 못 미치는 수치이므로 AES-128만 되어도 무차별 대입 공격에서 안전하다.
AES를 비롯한 비밀 키 체계에서 어려운 문제는 키 분배(key distribution)이다. 통신 중인 당사자들은 키를 알아야 통신이 가능하므로 키를 각자하게 안전하게 전달해야 하는데, 여기서 유출이 있을 수 있다는 것이다. 또 다른 문제는 키 확산(key proliferation)이다. 서로 관련 없는 여러 당사자들과 각각 비밀 대화를 하려면 각 그룹에 별도의 키가 필요하다.
이런 어려움 때문에 새로운 암호 체계인 공개 키 암호 기법이 개발됐다.
97. 공개 키 암호 기법과 닫힌 자물쇠
공개 키 암호기법
공개 키 암호 기법(public key algorithm)은 비밀 키 암호 기법과는 완전히 다른 기법이다. 스탠퍼드 대학의 Whitfield Diffie와 Martin Hellman이 Ralph Merkle의 아이디어를 일부 활용하여 1976년에 발명했는데, 이 업적으로 디피와 헬만은 2015년 튜링상을 공동 수상한다.
공개 키 암호 체계에서는 사람마다 공개 키와 개인 키로 구성된 키 쌍(key pair)을 갖는다. 쌍으로 된 키는 서로 수학적으로 연관되어 있고, 둘 중 하나의 키로 암호화된 메시지는 다른 하나의 키로만 해독할 수 있다. 키가 충분히 길다면 공격자가 아주 좋은 알고리즘을 사용하더라도 키 길이에 따라 실행 시간이 지수적으로 증가하기 때문에 현실적으로 공개 키에서 개인 키를 추론하는 것은 계산상 불가능하다.
공개 키는 흔히 웹페이지에 게시되어 진짜로 공개되며, 개인 키는 키 쌍의 소유자만 알게된다.
앨리스와 밥으로 돌아와서, 앨리스가 밥만 읽을 수 있도록 암호화된 메시지를 보내는 상황을 생각해보자. 앨리스는 밥의 웹페이지에서 공개 키를 가져오고, 밥에게 보낼 메시지를 암호화하는데 사용한다. 이 메시지는 이브가 도청해도 해독할 수가 없다.
밥은 자신만 알고 있는 개인 키를 이용해 앨리스의 메시지를 해독한다. 이 방법 외에 앨리스의 메시지를 해독할 방법은 없다. 밥은 앨리스에게 답신을 보낼 때, '앨리스의' 공개 키로 암호화하여 보낸다. 밥의 메시지를 해독할 방법은 오직 앨리스만 알고 있는 자신의 개인 키이고, 앨리스는 개인 키로 밥의 답신을 해독한다.
이 방식은 키 분배 문제를 해결해준다. 왜냐하면 공유되는 비밀이 없기 때문이다. 앨리스와 밥은 공개된 키를 웹페이지에 올려두었고, 누구나 이 키를 이용해 메시지를 보낼 수 있다. 하지만 이 메시지는 앨리스와 밥 본인들 외에는 해독할 수 없다.
공개 키 암호 기법은 인터넷 보안 통신의 필수 구성 요소다. 온라인으로 뭔가를 산다고 했을 때, 쇼핑몰에 신용카드 번호를 알려줘야 한다. 하지만 신용카드 번호를 평문으로 보낼 수는 없으므로 암호화된 통신 채널이 필요하다. 이 때 사용되는게 공개 키 암호 기법이다.
브라우저는 우선 임시 키를 무작위로 생성한다. 그런 다음, 쇼핑몰의 공개 키를 이용해 임시 키를 암호화하여 쇼핑몰에 보낸다. 쇼핑몰은 자체 개인 키를 이용해 임시 키를 해독한다. 그 후, 이렇게 공유된 임시 키를 사용해 AES로 신용카드 번호 같은 개인정보를 암호화한다.
공개 키 암호 기법의 결점은, 알고리즘이 더 느리다는 것이다. 그래서, 일반적으로 모든 정보를 공개 키로 암호화하진 않고 2단계 절차를 이용한다. 먼저 공개 키를 사용해 임시 비밀 키에 대해서 합의한 다음, AES를 사용해 대량으로 데이터를 전송한다.
이렇게 하면 각 단계에서 통신의 보안이 유지된다. 처음에는 임시 키를 설정하기 위해 공개 키를 사용하고, 다음으로 대량 정보 전송에는 AES를 사용해서 통신 보안이 유지된다.
이 기법이 HTTPS 프로토콜의 원리다. HTTPS는 통신 처리를 약간 느리게 만들지만 미미한 수준이고, 보안 수준은 높아진다.
공개 키 암호 기법은 디지털 서명(digital signature)을 구현하는데도 사용된다. 사기꾼이 아니라 앨리스가 메시지를 보냈음을 수진자가 확인할 수 있도록 앨리스가 메시지에 서명한다고 하자. 앨리스가 자신의 키로 메시지를 암호화하고 결과를 보내면, 누구나 앨리스의 공개키를 통해 메시지를 해독할 수 있다. 개인 키는 앨리스만 알기에, 공개키로 해독되는 서명은 앨리스의 서명이 맞다.
앨리스가 밥에게 보내는 비공개 메시지에 서명하는 상황을 생각해보자. 앨리스는 먼저 밥에게 보낼 메시지에 자신의 개인 키로 서명한 다음, 그 결과를 밥의 공개키로 암호화한다. 이 메시지는 밥의 공개키로 암호화되었기에 밥만 해독할 수 있다. 밥은 이렇게 메시지를 해독하는데, 그렇게 한번 해독한 메시지는 앨리스의 개인 키로 서명되었기에 앨리스의 공개키로 해독할 수 있다. 이렇게 해서 밥은 앨리스가 이 비공개 메시지를 보낸 사람인지 확인할 수 있다.
물론 공개 키 암호 기법에도 한계가 있다. 개인 키가 해킹되면, 앨리스가 전송한 모든 메시지를 해독할 수 있고 과거 앨리스가 한 서명은 모두 신뢰할 수 없어진다. 대부분의 키 생성 방식에 키가 언제 만들어졌고 언제 만료될 예정인지 정보가 포함되어 있긴 하지만, 키 취소는 어렵다. 즉, 특정 키가 더 이상 유효하지 않다는 정보를 보여주긴 어렵다. 또, 안전하게 통신을 해놓고도 나중에 서버의 개인 키가 유출된다면 과거의 통신 내용이 다 유출될 수 있다.
순방향 비밀성(forward secrecy)이란, 서버 개인 키가 노출되어도 이전 데이터의 기밀성을 유지해야 한다는 개념이다. 순방향 비밀성을 보장하려면 서버의 개인 키가 해킹당해도 과거의 세션 통신 내용은 복호화할 수 없어야 한다. 이를 위해선, 개별 메시지가 일회용 비밀번호로 암호화되고 비밀번호는 폐기되는 식으로 각 세션마다 독립적인 비밀번호를 써야한다. 이 비밀번호가 재생성하기 충분히 어렵게 생성된다면, 서버 개인 키가 해킹되더라도 한 메시지에 대한 비밀번호를 알더라도 다른 메시지는 해독하기 어렵다.
자주 쓰이는 공개 키 알고리즘
가장 널리 쓰이는 공개 키 알고리즘은 RSA이다. RSA는 1978년 MIT에서 Ronald Rivest, Adi Shamir, Leonard Adlemean이 개발했고 이들의 이름 이니셜을 따서 이름이 붙었다.
RSA 알고리즘은 매우 큰 합성수가 인수분해하기 어렵다는 점에 기반한다. RSA는 최소 500자릿수의 매우 큰 정수를 생성하는데, 이 수는 큰 두 소수의 곱이고, 각 소수의 자릿수가 큰 정수의 절반 정도다. RSA는 이 값들을 공개 키와 개인 키의 기준으로 사용해서, 인수를 알고 있는 개인 키 보유자는 암호화된 메시지를 해독할 수 있지만 다른 사람들은 현실적으로 인수분해하기 불가능한 정수를 인수분해할 수 없기 때문에 해독할 수 없다. 리베스트, 샤미르, 애들먼은 이 업적으로 2002년 튜링상을 받았다.
RSA 같은 공개 키 알고리즘은 보안은 아주 뛰어나지만 속도가 느리기 때문에, 문서 전체에 RSA로 직접 서명하려면 시간이 너무 많이 걸린다. 그래서 일반적으로는 문서 전체를 서명하지 않고, 문서에서 일종의 작은 요약본만 만들어 간접적으로 서명하곤 한다. 이 작은 요약본을 메시지 다이제스트(message digest) 또는 암호 해시(cryptographic hash)라고 한다. 메시지 다이제스트(=암호 해시)는, 문서를 입력하면 복잡한 규칙으로 비트를 뒤섞어서 고정된 길이의 비트 시퀀스(예를 들면 256비트의 고정 된 값인 다이제스트, 또는 해시)로 바꾸는 알고리즘을 이용해 생성된다.
이 알고리즘을 통하면 같은 다이제스트를 갖는 또 다른 입력 값을 찾기가 계산적으로 실행 불가능하다. 또, 입력 값이 조금이라도 변경되면 다이제스트에 있는 비트의 절반 정도가 변경된다. 글자 하나만 달라도 완전히 다른 해시가 나오는 것이다. 따라서 원본 다이제스트와 서명된 문서의 다이제스트 또는 해시를 비교함으로써 문서가 조금이라도 변조되었는지 효율적으로 검출할 수 있다.
로널드 리베스트가(RSA의 R이다) 만든 메시지 다이제스트 알고리즘인 MD5는 128비트의 고정 결과를 만든다. NIST에서 만든 SHA-1은 160비트 결과를 만드는데, 현재 MD5와 SHA-1은 모두 약점이 있는 것으로 밝혀져 더 이상 쓰이지 않는다. NSA에서 만든 SHA-2에는 알려진 약점이 없다. 그럼에도 불구하고 NIST는 새로운 메시지 다이제스트 알고리즘을 만들기 위해 AES 때처럼 공개 대회를 열었고, 2015년 대회에서 SHA-3으로 알려진 알고리즘이 우승했다. SHA-2와 SHA-3은 224~512 비트의 다이제스트 크기 범위를 제공한다.
암호 기법의 높은 보안 수준에도 불구하고, 이것만으론 충분하지 않고 우리에겐 실제로 신뢰할 수 있는 제3의 기관이 필요하다. 예를 들어, 책을 주문할 때 아마존과 통신하고 있다고 생각하지만 실제로는 사기꾼일 수도 있다. 아마존 사이트를 방문했을 때 아마존이 정말 그 아마존임을 신원 입증해줄 기관이 필요하다는 것이다.
이를 위해 아마존은 사이트를 방문하면 유저에게 인증서(certificate)를 보낸다. 인증서는 아마존의 신원을 입증할 때 쓰기 위해 디지털로 서명된 정보 모음으로, 독립적인 인증 기관(certificate authority)에서 발급한다. 브라우저는 인증 기관의 공개 키로 인증서를 확인해 이 사이트가 아마존의 것임을 확인한다.
이론적으로, 이 사이트가 아마존임을 신뢰할 수 있으려면 인증 기관을 신뢰해야 한다. 일반적으로 사용되는 브라우저는 놀라울 정도로 많은 인증 기관을 알고 있는데, 그 중 대다수는 한번도 들어본 적이 없고 멀리 떨어진 곳에 있는 기관이다.
98. 인터넷에 흔적을 남기지 않고 거래할 수 있을까?
인터넷을 사용하면 사용자의 많은 정보가 드러난다. 우선, IP 주소는 모든 상호작용을 위해 필요한데, IP 주소를 보면 사용 중인 ISP를 알아서 누구나 사용자가 어디에 있는지 추측할 수 있다.
브라우저를 사용하면 더 많은 정보가 드러나는데, 브라우저는 참조하는 페이지 URL과 함께 브라우저 종류, 처리할 수 있는 응답 종류 등에 대한 자세한 정보를 보낸다. 이외에도 앞서 살펴본 브라우저 핑거프린팅을 통해 로드되는 글꼴 종류와 다른 속성 등을 종합해 사용자를 식별할 수 있다.
first party simulator(책에서는 panopticlick.eff.org였지만 바뀌었다)에서는 자신의 브라우저 정보가 얼마나 고유하게 식별되는지 확인할 수 있다. 글을 쓰는 시점에 써보니 나는 아래와 같이 260,110명 중 유일하게 해당 브라우저 세팅을 쓰고 있는 사람으로, 누군지 특정될 수 있다고 나왔다.

사람들이 그렇게까지 웹 브라우저를 다양하게 바꿔 쓰나?라고 생각할 수 있지만, 자동으로 전송되는 에이전트 헤더나 설치된 글꼴, 플러그인 등의 정보는 사람들이 통제할 수는 없으나 브라우저 공급 업체에서는 자동으로 보내는 정보이다. 또, 아이러니하게도 만약 '쿠키 차단'이나 '추적 안 함'을 활성화하면, 그것마저도 브라우저 설정을 좀 더 분명하게 구분되게 한다.
토어와 토어 브라우저
들키지 않고 어떤 부정행위를 알리려는 내부 고발자, 예를 들면 에드워드 스노든 같은 입장이 되었다고 생각해보자. 독재 정권에 맞서는 반체제 인사이거나, 동성애가 박해받는 국가에 사는 동성애자이거나 하는 경우일 수도 있다. 이럴 때는 인터넷을 쓸 때 감시를 피하고 싶을 것이다. 즉, 자신을 식별하기 어렵게 해야 한다.
이럴 때 암호 기법을 사용해 최종 수신자가 연결이 시작된 위치를 알 수 없을 정도로 대화를 감출 수 있다. 그중 가장 널리 사용되는 시스템은 Tor(토어)라고 하며, The Onion Router(양파 라우터)라는 뜻이다. (대화가 한곳에서 다른 곳으로 전달될 때 대화를 겹겹이 둘러싼 암호화를 양파에 비유한 것이다.)
토어는 인터넷 트래픽을 일련의 중계 노드를 통해 전송하고자 암호화 기법을 쓴다. 각 중계 노드는 경로상 바로 인접한 중계 노드의 정체만 알고 나머지 중계 노드의 정체는 모른다. 경로상 첫 번째 중계 노드는 발신자는 알지만, 최종 목적지는 모른다. 마찬가지로, 경로상 마지막 중계 노드는 목적지는 알지만, 최초 발신자는 모른다. 가운데 있는 노드도 정보를 중계하는 노드와 자신이 보내는 또 다른 중계 노드만 알고, 그 이상은 모른다. 실제 콘텐츠도 각 단계에서 암호화된다.
메시지는 여러 겹의 암호화로 둘러싸여 있는데, 각 중계 노드는 메시지를 다음 노드로 전송하면서 한 겹의 암호화를 제거한다. 일반적으로 세 개의 중계 노드가 사용되므로 중간에 있는 중계 노드는 출발지 또는 목적지에 대해 아무것도 모른다. 전 세계적으로는 약 7,000개의 중계 노드가 있고, 토어 애플리케이션은 중계 노드 집합을 무작위로 선택하고 경로를 설정한다. 이 경로는 때때로 바뀌며, 단일 세션 중에도 변경된다.
토어를 사용하는 가장 일반적인 방법은 토어 브라우저를 사용하는 것이다. 토어 브라우저는 데이터를 전송할 때 토어를 사용하도록 구성된 파이어폭스의 수정 버전이며, 파이어폭스 개인정보 보호 설정도 적절히 지정한다. 토어 브라우저는 파이어폭스와 거의 같지만, 부가적인 라우터와 몇 겹의 암호화를 통과하는데 시간이 걸리므로 약간 더 느리다. 또, 일부 웹사이트는 토어 사용자를 차별 대우하기도 하는데, 왜냐면 웹사이트를 공격하려는 사람들도 익명성을 중시하므로 토어를 사용하고 있을 가능성이 있기 때문이다.
물론, 토어는 모든 프라이버시 문제에 대한 완벽한 해결책이 아니고, 부주의하게 사용하면 익명성이 훼손될 수 있다. 예를 들면 로그인을 하거나 파일들을 다운로드/업로드한다면 익명성을 보장받을 수는 없다. 또, 토어를 사용하면 아무래도 일반적인 케이스가 아니므로 더 눈에 띌 수 있다.
하지만 현재까지 일반인이 사용할 수 있는 최고의 개인정보 보호 도구는 토어인듯 하다. 에드워드 스노든의 문서에도 NSA가 토어 사용자의 익명화를 해제할 수 없을거라는 내용이 나온다.
보안에 매우 집착하는 편이라면 Tails(The Amnestic Incognito Live System)라는 운영체제도 있다. 테일즈는 DVD, USB 드라이브, SD 카드 같은 부팅 가능한 장치에서 실행되는 특별한 리눅스 배포판으로, 토어와 토어 브라우저를 실행하며 실행되는 컴퓨터에 흔적을 남기지 않는다. 테일즈는 로컬 저장 장치에는 아무것도 저장하지 않고 주기억 장치에만 데이터를 저장하므로 세션 후에 컴퓨터가 종료되면 메모리 내용은 지워진다. 테일즈는 오픈소스이며 웹에서 공식 페이지에서 다운로드 가능하다.
비트코인
결제를 할 때 요즘은 신용카드나 체크카드를 쓰기에 구매자가 식별되고 흔적이 남는다. 암호 기법을 이용해 익명 화폐를 만든 것이 비트코인(Bitcoin)으로, 사토시 나카모토가 창안해 2009년에 오픈소스 소프트웨어로 공개된 기술이다.(심지어 사토시 나카모토도 익명성이 유지되어 진짜 정체가 밝혀지지 않았다.)
비트코인은 분산화된 디지털 화폐, 즉 암호화폐(cryptocurrency)다. 비트코인은 정부나 기관에서 발행하거나 통제하지 않으며, 물리적 형태가 없다. 가치도 정부에서 발행하는 돈처럼 명령으로 정해지거나 금 같은 희소한 천연자원에 기반을 두지 않는다. 대신, 사용자들이 상품과 서비스에 얼마만큼 비트코인을 지불하고 받으려고 하는지에 따라 가치가 결정된다.
비트코인은 두 당사자가 중개인 또는 신뢰할 수 있는 제3의 기관을 거치지 않고 P2P 프로토콜로 직접 비트코인 그 자체를 교환하게 한다. 비트코인 프로토콜은 비트코인이 정말로 교환(소유권이 이전)되고, 거래 과정에서 비트코인이 새로 생기거나 없어지지 않으며, 거래를 뒤집을 수 없도록 보장한다. 그러면서도 거래 당사자는 서로에게, 또 외부 세상에도 모두 익명으로 남는다.
비트코인의 모든 거래는 공개 장부(public ledger)를 유지하는데, 이를 블록 체인(blockchain)이라고 한다. 하지만 거래 배후에 있는 당사자들은 익명이고, 사실상 암호 기법에서 공개 키에 해당하는 주소로만 식별된다. 비트코인은 지불 정보를 검증하고 공개 장부에 저장하기 위해 계산적으로 어려운 작업을 일정량 수행함으로써 생성되는데, 이를 비트코인이 채굴된다고 표현한다.
블록체인의 블록들은 디지털 서명되고 이전 블록들을 참조하게 되어 있어서, 블록들을 만들기 위해 원래 했던 작업을 다시 하지 않고선 이전 거래를 수정할 수 없다. 즉, 맨 처음부터 이루어진 모든 거래 상태가 블록체인에 함축되어 있으며, 이론적으로 다시 생성하는건 가능하지만 이전의 모든 작업을 모두 수행하지 않고서는 아무도 새로운 블록체인을 위조할 수 없기 때문에 계산적으로 실행 불가능하다.
블록체인은 완전히 공개되어 있으므로, 비트코인의 익명성은 사실 가명성(pseudonymity)에 더 가깝다. 모든 사람이 특정 주소와 연관된 모든 거래의 모든 정보를 알 수 있지만, 그 주소가 누구의 것인지는 모른다. 물론 이 주소를 적절히 관리하지 않으면 해당 사용자는 자신이 했던 거래와 연관지어져 익명성을 잃는다. 또, 개인 키를 잃어버리면 비트코인을 영원히 잃게 된다.
비트코인은 당사자들이 주의하기만 하면 익명을 유지할 수 있으므로 마약 거래, 랜섬웨어 데이터 값 지불이나 다른 불법 행위로 인기 있는 화폐다. **실크 로드(Silk Road)**라는 웹 사이트는 불법 마약 판매용으로 이용되었는데 지불 수단으로 비트코인을 사용했다. 실크 로드의 운영자가 잡힌건 익명 소프트웨어가 잘못되어서가 아니라, 예전에 온라인에 드물게 흔적을 남겨서였다.
99. 요약
암호 기법은 최신 기술에서 필수적인 부분으로, 우리가 인터넷을 사용할 때 프라이버시를 보호하고 보안을 유지하는데 쓰이는 기본 메커니즘이다. 하지만 이 기법은 선한 사람, 악한 사람을 막론하고 모두에게 도움이 된다. 즉, 선량한 개인 인터넷 사용자 뿐 아니라 범죄자, 테러리스트, 포르노 제작자, 범죄 조직 및 정부 모두 각자에게 도움이 되는 방식으로 암호 기법을 쓴다.
암호 기법 코드는 대부분 오픈소스이므로 누구나 구한다. 암호 기법 관련해서, 이것이 테러리스트와 범죄자에게도 도움이 되므로 불법화해야 하는지, 암호 체계에 '백도어'를 마련해 적합하게 인가된 정부 기관이 범죄 조직이 암호화한 모든 것을 백도어로 해독할 수 있어야하는지 토론이 오간다.
전문가들은 백도어에 대해 나쁜 발상이라고 생각한다. 암호 기법은 제대로 만들기 대단히 어렵고, 의도적인 약점을 추가하는 것은 약점을 아주 신중하게 설계했더라도 더 큰 위험을 불러오기 쉽다. 또, 암호 기법을 약화하는건 테러리스트 뿐 아니라 모든 사람에게 적용된다. 애플 CEO 팀 쿡은 이렇게 말한다:
"현실은 이렇습니다. 만약 제품에 백도어를 넣으면 그 백도어는 모든 사람들, 즉 좋은 사람과 나쁜 사람 모두를 위한 것이 됩니다."
심지어 사기꾼, 테러리스트, 국가 정부 등은 약화된 버전을 어떻게든 사용하지 않으려고 하기 대문에 이전보다 못하게 될 것이다.
2015년 말, 두 명의 테러리스트가 캘리포니아주 샌버너디노에서 14명을 살해한 후 사살되었다. FBI는 테러리스트들이 사용하던 아이폰 중 한 대의 암호화를 해제하도록 애플에 요구했는데, 애플은 이걸 거부했다. 2019년에 플로리다에서 또 다른 총격 사고가 일어났고, 애플은 이때도 자신들이 보유한 모든 정보를 제공했지만 암호를 풀 수 있는 비밀번호는 없다고 했다. 애플은 정보에 접근하기 위한 특수 목적 메커니즘까지 만들면 모든 휴대전화 보안이 심각하게 약화될 것이라고 말했다.
이 논쟁은 양측 모두 타당한 관점이 있다. 저자 브라이언 커니핸은 강력한 암호화가 일반인이 정부의 과도한 간섭 및 침해에 맞서 쓸 수 있는 몇 가지 방어책 중 하나이므로 포기해서는 안 된다고 생각한다. 법 집행 기관이 정보를 얻는 데는 많은 방법이 있으며, 그 정당성을 입증한다면 정보들을 얻을 수 있다. 소수의 사람을 조사하기 위해 모든 사람의 암호화를 약화시키는 것은 리스크가 따르는 행동이다.
모든 보안 시스템을 약화시키는 가장 큰 요인은 사실 시스템과 관련된 사람들이다. 시스템이 너무 복잡하다면 사용자들은 편의를 위해 의도적으로 시스템을 와해시킨다. 예를 들어, 비밀번호를 변경하라고 요구받으면 사용자들은 귀찮아서 일정한 공식에 의존하거나 비밀번호를 어디에 적어두는데, 이는 보안을 약화시킨다. 예를 들어, 사기꾼이 비밀번호 3개 중 2개를 알고 있다면 나머지 하나를 유추하는 것은 크게 어렵지 않을 수 있다.
아무리 보안을 철저히 하고자 노력해도, 사기꾼들은 정보에 접근하기 위해 네 가지 B, 즉 Bribery, Blackmail, Bulglary, Brutality(뇌물, 협박, 절도, 잔혹 행위)를 사용할 수 있다. 요컨대, 항상 모든 위협에서 벗어날 수는 없다. 하지만 신중하게 행동하면 자신을 적절히 보호할 수 있다.
🤠 개인 탐구
HTTPS
HTTP는 평문으로 통신하고 통신에 수많은 라우터를 통과하기에 중간에서 보내고 받는 내용을 스누핑할 수 있다. 이에, 중간에서 내용을 볼 수 없도록 통신 내용에 암호화 프로토콜인 SSL 또는 TLS를 적용해서 보완하는데 이것이 HTTPS이다. 즉, HTTPS는 SSL 또는 TLS 위에서 동작하는 HTTP다. 오늘날 SSL은 보안성 문제로 사실상 쓰이지 않고 대부분 TLS를 사용하는데, 이에 대해선 HTTPS를 먼저 살펴보고 알아보자.
HTTPS는 보안을 위해 아래 세 가지를 보장한다.
구분 | 내용 |
---|---|
기밀성(Confidentiality) | 도청자가 내용을 몰라야 한다 |
무결성(Integrity) | 누군가 중간에서 내용을 바꾸면 바로 알아야 한다 |
인증(Authentication) | 이 서버가 진짜인지, 사기꾼인지 확인 |
HTTPS 통신의 흐름은 크게 아래와 같이 정리할 수 있다.
- 서버 인증서 제공: 사용자가 어떤 사이트에 접속하면, 서버가 자신의 공개키와 인증기관이 서명한 인증서를 보낸다.
- 인증서 검증: 브라우저는 인증기관의 공개키를 가지고 인증서를 검증한다.
- 세션 키 교환: 브라우저는 서버와 안전하게 대화를 하기 위해 공개 키를 기반으로 공유할 대칭(세션) 키를 만들고 합의한다.
- 대칭키(AES 등)로 통신: 임시 세션키를 공유하기에, 이후부터는 공유하는 대칭키 암호화 통신으로 빠르게 통신한다.
즉, HTTPS는 처음에는 공개 키 알고리즘을 통해 안전하게 세션 키를 공유하고, 공유가 되면 이 세션 키를 암호 키로 해서 암호화 통신을 이어간다.
여기서, 세션 키 교환 과정에 "공개 키를 기반으로 공유할 대칭 키를 만들고 합의**하는 과정이 있다고 했는데, 구체적으로 어떻게 이루어지는 걸까? 여기서 앞서 언급한 TLS가 나오는데, 책에서는 TLS 1.2까지 쓰인 방식을 소개했지만 이후 TLS 1.3이 나와 쓰이고 있어 해당 내용으로 알아보자.
SSL/TLS
SSL은 Secure Sockets Layer의 약자로, 넷스케이프가 1990년대에 만든 최초의 보편적 암호화 프로토콜이다. 하지만 보안 취약점이 발견되어, TLS(Transport Layer Security)가 나왔고, 현재는 대부분 TLS를 사용한다.
오늘날 쓰이는 TLS는 1.2버전과 이후에 2018년에 공개된 1.3 버전인데, TLS 1.2까지 쓰이던 브라우저와 서버의 세션 키 공유 방식과 1.3버전의 방식이 다르다.
-
Premaster Secret 전송 방식(~TLS 1.2)
이 방식에선 브라우저가 Premaster Secret이라는 랜덤 숫자를 생성해서, 서버의 공개 키로 암호화해 서버에 보냈다. 그러면 서버는 자신의 개인 키로 복호화해 Premaster Secret을 얻어, 서버와 브라우저 모두가 이 Premaster Secret이라는 공유된 수를 가지고 정해진 수학 공식에 따라 최종 세션 키를 계산해 해당 키로 통신했다.
이 방식은 만약 서버의 개인 키가 유출되면, 과거 모든 통신 내용이 복호화된다는 문제가 있다(본문에서 언급했던, 순방향 통신성).
-
Diffie-Hellman 키 교환(TLS 1.3)
약간 복잡하니 간략화된 실제 수를 넣어가며 알아보자. 아래의 숫자들은 모두 예시를 위해 아주 작게 설정되었지만, 실제로는 훨씬 큰 수가 더 복잡하고 강력한 방법인 ECDHE(타원 곡선 위에서 실행되는 디피-헬만 키 교환)를 통해 실행된다.
디피-헬만 키 교환 방식에선 우선 공개값 g(Generator)와 p(Prime Number)를 가진다. 둘 다 통신을 시작할 때 세팅하거나, 서버가 제안하는걸 따르며 브라우저와 서버는 이 값을 모두 알고 있다.(심지어 외부에서도 이 값을 알려면 알 수 있다.) 이번 예시에선 p=23, g=5라고 가정하자.
이후, 브라우저와 서버는 각자의 비밀번호를 만든다. 브라우저의 비밀번호는 6, 서버의 비밀번호는 15인 상황을 가정한다.
다음으로, 둘 다 자신의 공개 키를 이 비밀번호와 공개값들 g, p를 통해 생성한다.
브라우저의 공개 키는 A = g^a mod p = 5^6 mod 23
, 서버는 B = g^b mod p = 5^15 mod 23
, 즉 브라우저는 15625 mod 23 = 8, 서버는 30517578125 mod 23 = 2의 공개 키를 가진다. 브라우저와 서버는 각자 이렇게 나온 공개 키를 서로와 교환한다. 이 값도 누가 훔쳐봐도 상관 없다.
이 둘은 다음으로 받은 값을 이용해 공유 비밀을 계산한다. 브라우저는 서버의 공개 키 2를 받고, 자신의 비밀번호 6을 이용해 B^a mod p = 2^6 mod 23
즉 64 mod 23 = 18을 얻고 서버는 A^b mod p = 8^15 mod 23
인 18을 얻어 공유 비밀인 18이라는 세션 키로 사용한다.
A = g^a mod p
에서 g, p, A가 모두 공개인데 a를 알아맞추는게 어렵나?"라고 생각할 수 있다. 하지만 실제로 아주 어렵다. 이를 이산 로그 문제(Discrete Logarithm Problem)라고 하는데, 앞선 수식에서 a
를 구하는 방법은 사실상 하나씩 다 넣어보는 수밖에 없고, TLS(또는 비트코인)에서 p값은 2048 비트이기 때문에 경우의 수는 2^2048개이다(현재 지구상 모든 컴퓨터를 다 동원해도 우주의 수명보다 더 오래 걸린다). 따라서 공개값을 다 알아도, 서버와 브라우저가 각각 만든 비밀 랜덤 수는 이산 로그 문제로 인해 알 수가 없다.심지어, 이제는 디피-헬만 키 교환에서 더 진화한 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral) 즉 "타원 곡선 위에서 작동하는, 일회용 키를 사용하는 디피-헬만 키 교환 방법"을 쓰는데 타원 곡선(
y² = x³ + ax + b
)은 빠르고, 짧은 키로도 매우 강력한 보안을 제공하기에 계산도 빠르고 작은 키로도 강력한 보안이 제공된다.하지만 이론상으로 이렇게 완벽해 보이는 방법도 약점이 있는데, 바로 아래에 나오는 중간자 공격이다.
중간자 공격
두 사람 사이의 통신을 몰래 가로채고, 변조하거나 엿보는 공격으로, MITM(Main-in-the-Middle)이라고도 부른다.
앨리스와 밥이 암호화된 통신을 할 때, 사용하는 채널을 말로리(Mallory)가 도청하고 있고, 나아가 위조도 할 수 있는 능력이 있다고 하자. 앨리스는 밥에게 자신의 공개키를 보내는데, 이 때 말로리는 앨리스의 메시지를 가로챈 다음 메시지에 담긴 앨리스의 공개키를 자신이 미리 준비한 말로리의 공개키로 바꿔서 밥한테 보낸다. 즉, 밥은 앨리스의 공개키를 받았다고 생각하겠지만 실제론 말로리의 키를 받은 것이다.
밥은 말로리의 키를 자신의 공개키로 암호화해서 앨리스에게 전송하는데, 말로리는 이것도 가로채 자신의 개인키로 이 메시지를 복호화하고, 원문을 앨리스의 공개키로 암호화해 앨리스에게 보낸다. 이런식으로 말로리는 앨리스와 밥의 대칭키 교환까지 가로챌 수 있고, 이 과정에서 앨리스와 밥은 자신들의 메시지가 도청당하고 위조당했다는 사실도 알 수 없다.
첩보 영화 같은 얘기지만, 실제로 현실에서 일어나는 일들이다. 대표적으로 무료 와이파이가 많이 쓰인다. 공격자는 카페에서 가짜 와이파이(예: Cafe_FREE_WIFI)를 만들어 놓고, 접속한 사람들의 트래픽을 가로채고 정보를 가로챈다. DNS 스푸핑은 공격자가 DNS 응답을 조작해 가짜 은행 사이트 등으로 유도하는 공격이다. 또, HTTPS 인증서를 위조하기도 한다.
HTTPS는 이를 위해 서버가 인증기관이 서명한 인증서를 검증하고, 인증서가 위조되었거나 무효라면 **"이 연결은 안전하지 않습니다"**라는 경고를 띄운다.