seegongsik
보안

어떻게 편지가 진짜인지 확인하기, 서명

지금까지는 남이 못 읽게 지키는 법을 주로 봤다. 그런데 메시지가 비밀일 필요는 없고, 정말 그 사람이 보냈는지만 확인하고 싶을 때가 있어요. 앞 레슨에서도 키 교환 상대가 진짜인지 확인해야 한다는 숙제가 남았다. 보낸 사람이 자기만 가진 개인키로 메시지에 도장 같은 표시를 남기고, 누구나 그 사람의 공개키로 표시가 진짜인지 확인할 수 있다면 어떨까? 이것이 전자 서명이다.

01

누가 보냈는지 모르면

편지 한 통이 도착했고 끝에 어떤 사람의 이름이 적혀 있다고 하자. 정말 그 사람이 쓴 것일까? 이름은 누구나 베껴 적을 수 있고, 내용도 오는 길에 누가 슬쩍 고쳤을지 모른다. 글자만 봐서는 알 길이 없어요.
이것은 비밀이냐 아니냐의 문제가 아니다. 내용은 다 드러나도 괜찮다. 다만 정말 그 사람이 보냈는지, 오는 동안 바뀌지 않았는지를 알고 싶은 것이다.

내일 정오에 만나요.
보낸 사람민우
글자만 보고는 진짜인지 가릴 수 없어요.

이름을 의심하는 버튼과 내용을 의심하는 버튼을 눌러 보자. 이름이 베낀 것인지, 내용이 바뀌었는지는 글자만으로 가릴 수 없어요.

직접 눌러 보니 답답했다. 이름이 적혀 있어도 확신이 서지 않는다. 우리에게 필요한 증거는 두 가지다. 정말 그 사람이 보냈다는 증거, 그리고 오는 동안 바뀌지 않았다는 증거다.
이 둘을 한 번에 보여 주면서 남이 흉내 낼 수 없는 표시가 있으면 좋겠어요. 공개키 레슨에서 본 열쇠 한 쌍이 바로 그 일을 해낸다.

02

개인키로 서명해요

공개키 레슨에서는 받을 사람의 공개키로 잠갔다. 서명은 방향이 반대다. 보낸 사람이 자기 개인키를 써서 메시지에 서명을 붙여요. 자물쇠로 잠그는 것이 아니라 메시지 옆에 도장을 찍는 셈이라 내용은 그대로 다 보인다.
실제로는 메시지 전체가 아니라 메시지의 해시, 곧 지문에 개인키로 계산을 해서 서명을 만든다. 개인키는 그 사람만 가지고 있으니 이 도장은 그 사람만 찍을 수 있다.

내일 정오에 만나요.메시지
서명
개인키
내 개인키로만 만들 수 있는 도장을 붙여요.

개인키로 서명하기를 눌러 보자. 내용은 그대로 보이고, 그 사람만 만들 수 있는 서명이 함께 붙어요.

서명이 붙었지만 메시지 글자는 하나도 가려지지 않았다. 잠근 것이 아니라 도장을 더한 것이기 때문이에요. 이 서명은 메시지 내용의 지문에서 나왔으니 내용과 단단히 묶여 있다. 메시지 전체가 아니라 지문에 서명하는 까닭은 지문이 짧고 길이가 늘 같아서, 큰 파일이라도 서명이 금방 끝나기 때문이다. 내용이 바뀌면 지문도 바뀌니 지문에 서명하는 것만으로 내용 전체를 지킬 수 있다.
그리고 이 도장을 만들려면 반드시 그 사람의 개인키가 있어야 한다. 개인키는 주인 손을 떠나지 않으니 남이 같은 도장을 만들 수 없다. 그렇다면 받는 쪽은 이것을 어떻게 확인할까?

03

공개키로 검증해요

받는 사람은 보낸 사람의 공개키로 서명을 검증한다. 검증은 이 도장이 정말 그 공개키와 짝인 개인키로 찍힌 것인지, 그리고 지금 받은 내용의 지문과 맞는지 묻는 일이에요.
둘 다 맞으면 검증이 통과한다. 다른 사람의 개인키로 찍은 도장은 그 공개키로 검증하면 실패한다. 공개키와 개인키가 짝이어야만 통과하기 때문이다.

민우의 공개키
검증—
서명을 눌러 공개키로 검증해요.

서명을 하나씩 눌러 민우의 공개키로 검증해 보자. 민우의 개인키로 찍은 서명만 통과하고, 다른 사람의 키로 찍은 것은 실패해요.

짝이 맞는 개인키로 찍은 서명만 통과했다. 통과가 뜻하는 바는 분명하다. 이 메시지는 정말 그 사람이 보냈다는 것이다. 공개키는 온 세상이 가지고 있어도 괜찮아요. 공개키로는 검증만 할 수 있고 서명은 만들 수 없기 때문이다.
도장을 찍는 권한은 개인키 주인에게만 있고, 도장을 확인하는 일은 누구에게나 열려 있다. 공개키로 잠그던 일의 거울상인 셈이다.

04

진짜이고, 안 바뀌었어요

서명은 메시지 내용과 묶여 있어서, 검증을 통과하면 두 가지가 한꺼번에 증명된다. 하나는 진짜 그 사람이 보냈다는 진위이고, 다른 하나는 한 글자도 바뀌지 않았다는 무결성이에요.
오는 길에 누가 내용을 살짝만 고쳐도 지문이 완전히 달라지므로 묶여 있던 서명과 맞지 않게 되고, 검증이 곧바로 깨진다. 바뀐 한 글자가 경보가 되는 셈이다.

약속 시각 12:00에 만나요.서명된 메시지
서명 SIG-7A2F
검증 통과
내용이 그대로라 서명과 들어맞아요.

시각을 바꿔 보는 버튼을 눌러 보자. 숫자 한 글자만 바뀌어도 서명과 맞지 않아 검증이 깨져요.

한 글자만 바꿨는데 검증이 곧바로 실패했다. 받는 사람은 이 실패를 보고 원래 내용이 아니라는 것을 알아채고, 함부로 믿지 않고 멈출 수 있어요. 또 개인키로 서명한 사람은 나중에 자기가 보내지 않았다고 잡아뗄 수 없는데, 이것을 부인 방지라고 한다.
그래서 전자 서명은 소프트웨어 업데이트, 전자 계약, 공문서처럼 출처와 원본이 중요한 곳에 두루 쓰인다. 이제 잠금과 서명을 나란히 놓고 정리해 보자.

05

정리

정리하면 이렇다. 전자 서명은 공개키 암호의 열쇠 한 쌍을 거꾸로 쓴다. 보낸 사람은 자기 개인키로 메시지의 지문에 서명하고, 받는 사람은 보낸 사람의 공개키로 검증한다. 통과하면 정말 그 사람이 보냈다는 것과 오는 길에 바뀌지 않았다는 것이 함께 증명돼요.
잠금은 내용을 비밀로 지키는 일이고, 서명은 누가 보냈고 바뀌지 않았는지 증명하는 일이다.

쓰는 열쇠—
받는 쪽—
얻는 것—
잠금과 서명을 눌러 견줘요.

잠금과 서명을 눌러 견줘 보자. 잠금은 비밀을 지키고, 서명은 진위와 무결성을 증명해요.

이제 잠금과 서명의 차이를 알았다. 받을 사람의 공개키로 잠그면 비밀이 지켜지고, 보낸 사람의 개인키로 서명하면 진위와 무결성이 증명된다. 같은 열쇠 한 쌍이 방향만 바꿔 두 가지 일을 해요.
그런데 검증이 의미가 있으려면 전제가 하나 있다. 그 공개키가 정말 그 사람의 것이어야 한다. 공개키를 무엇으로 믿을 수 있는지를 다음 레슨 인증서에서 다룬다.

한 줄 정리전자 서명은 공개키 암호의 열쇠 한 쌍을 거꾸로 쓴다. 보낸 사람이 자기 개인키로 메시지의 지문에 서명을 만들어 붙이는데, 개인키는 그 사람만 가지고 있으니 이 서명은 그 사람만 만들 수 있다. 받는 사람은 보낸 사람의 공개키로 서명을 검증하고, 통과하면 두 가지가 함께 증명돼요. 정말 그 사람이 보냈다는 진위, 그리고 한 글자도 바뀌지 않았다는 무결성이다. 내용을 조금만 바꿔도 검증이 깨지기 때문이다. 암호화가 내용을 잠가 비밀로 지키는 일이라면, 서명은 잠그지 않고 누가 보냈는지와 바뀌지 않았는지를 증명하는 일이에요. 서명한 사람은 나중에 보내지 않았다고 잡아뗄 수도 없다.
← 보안
이 페이지가 도움 됐다면 후원하기