혼자 일하거나 작은 회사에서 여러 역할을 맡는 프로그래머에게는 얕게라도 알아두어야 할 지식이 많다. 보안과 암호화도 그런 주제다. 웹 서비스나 모바일 앱을 개발한다면 사용자 개인정보를 안전하게 저장하기 위해 암호화를 고려해야 한다. 보안 HTTP 프로토콜을 이용하려면 SSL과 인증서에 대해 이해해야 한다. 하다못해 원격 작업의 필수 도구인 SSH만 해도 암호화된 프로토콜을 사용한다. (.ssh 설정법을 모르거나 키 파일에 퍼미션 설정 제대로 못 해서 SSH 접속할 때마다 직접 패스워드 입력하는 사람들 있을거다) 암호화는 대칭 키, 비대칭 키, 단방향 등 방식도 여러가지고 그런 방식을 지원하는 알고리즘도 여러가지다. 심지어 하나의 블록 알고리즘만 해도 운영 모드가 여러가지다. 암호화 한다고 데이터가 안전한 것인지 확신도 안 든다. 딱 필요한 만큼 얕게만 알고 싶은데 조금만 발을 담궈도 풍덩 빠져버릴 것 같다. 그때그때 필요한대로 공부하면서 여러 가지 암호화 알고리즘을 실무에 사용하고 있지만, 항상 내가 하는 방식이 과연 올바르고 안전한가 하는 불안이 있었고 찾아봐도 답이 쉽게 나오지 않는 찝찝한 의문(아래에 적은 것들)도 있었다.

  • Java API 같은 미산 프로그램의 암호화 알고리즘에 미국 정부의 백도어 같은 건 들어있지 않는가?
  • 국정원이 달려들어도 뚫지 못할 정도로 안전하려면 어떤 구성이 필요한가? 예를 들면, 어떤 알고리즘을 사용해야 하고 키 길이는 얼마나 돼야 하는가?
  • DB에 암호화를 하면 인덱스를 사용할 수 없을 텐데, 도대체 어떻게 개인정보를 암호화해야 하는가? 그걸 해준다는 값비싼 DB 암호화 서비스는 믿을만한가?
  • 클라이언트(인터넷 사업자)가 암호화를 보안 사고 났을 때 면책하기 위한 형식적 조처쯤으로 여기는데, 뭐라고 말해주어야 할까?

『인크립션: 실용주의 암호화』는 보안과 암호화에 관해 프로그래머(또는 기획자)가 알아야 할 최소한을 친절하게 설명해준다. 특히 여기저기 귀동냥으로 줏어듣는 것과 상상력으로 보안에 대한 학습을 대체했을 때 오해하기 쉬운 점들을 교정하려고 많은 노력을 기울인 것 같다. 이 책이 내가 궁금했던 의문을 다 풀어주지는 못하지만, (보안 교과서에 빠지지 않는 기초 보안 지식과 함께) 암호화의 기본 원리를 잘 설명해주어 적어도 어디서부터 출발해야할지를 깨닫게 해준다. 특히, DB 암호화와 인덱스 문제에 관해서는 한 챕터를 할당해 친절히 설명하고 있다. 이 책은 딱 실무 담당자에게 필요한 수준만큼만을 알려준다는 점이 장점이다. 암호의 핵심 원리와 다양한 구현물과 운용법을 소개하지만, 어려운 수학 알고리즘은 등장하지 않는다. 그래도 암호화 작업을 해 본 경험이나 배경 지식이 전혀 없다면 조금 어려울 듯하다. 책의 분량은 많지 않아서 전철 네 번 타는 동안 다 읽을 수 있을 정도였다.

책 내용 중 나에게 도움이 된 부분을 몇 가지 추려 본다.

  • “Chapter 1. 암호화를 정확히 알고 있나요?”, “Chapter 5. 암호 시스템, 원리를 알아야 전체가 보인다”: 현대의 복잡한 암호화 알고리즘도 결국은 치환(substitution, 문자 바꾸기. 혼돈을 일으킨다.)과 대치(permutation, 순서 바꾸기. 확산을 일으킨다.), 이 전통적인 두 가지 방식을 조합한 것이라고 한다. 보안 교과서들이 항상 조악한 카이사르 암호를 설명하는 이유가 이거였구나.
  • “Chapter 6. 적합한 운영 모드 고르기”: AES 알고리즘을 사용할 때 오라클 자바 API에서는 운영 모드가 디폴트로 설정되었던 것 같은데, 나중에 C와 파이썬에서 사용했던 라이브러리에서는 운영 모드를 직접 지정해야 했다. 당시엔 정확한 개념을 모른 채 단순히 ECB보다 CBC가 안전하다는 얘기를 듣고 초기화 벡터를 지정해 CBC 방식으로 암호화했다. 그 경험때문에 이 챕터가 좀 더 눈에 들어왔다. 이 책은 ECB, CBC 뿐 아니라 다양한 운영 모드의 원리와 안전성을 그림과 함께 친절히 설명해주어 쉽게 이해할 수 있었다.
  • “Chapter 7. 국가에서 정할 만큼 중요한 키 길이”: 마음같아선 키 길이를 무한정 길게 하고 싶지만 현실적으로 그러기가 어렵다. 이 챕터에서 키 길이가 얼마나 돼야 하는지를 유효기간과 함께 알려준다.
  • “Chapter 8. 자칫하면 위험한 말, 느려지지 않게 OPE로 해 주세요, Chapter 9: 데이터베이스 암호화, 이 정도는 알아 둡시다”: 데이터베이스에서 암호화를 할 때의 곤란함과 순서 유지 암호화(OPE)의 함정에 관해 설명한다. 단순히 어떤 제품군이 안전하다고 광고하니까 그냥 그걸 쓰면 안전하겠거니 하는 생각이 얼마나 위험한지 알 수 있다.
  • “Chapter 14. 정보보호 관련 법규와 암호화”: 개인정보보호법이 비밀번호를 비대칭 암호화하여 저장하도록 정했다고 한다. (나는 비밀번호 해시 저장은 기술적으로 도의적으로 당연히 해야 하는 관례 정도로 받아들이고 있었다.) 그 외에도 관련 법령이 각종 개인정보의 암호화를 강제하고 있다. 그런데 데이터를 어떻게 안전하게 보호하도록 할 것인가에 대한 종합적인 규정이 없다. 아무래도 사업자들은 암호화를 면책을 위한 형식적 조처쯤으로 받아들이기 쉽지 않은가 하는 생각이 든다.