티스토리 뷰
이번 글에서는 서명을 하고 서명을 확인하는 방법을 알아보겠습니다.
지난 글에서 암호화는 받는 사람의 공개키를 이용해 하고 복호화는 받은 사람이 개인키를 이용해 한다고 했습니다.
서명은 반대로 서명자가 개인키로 서명하고 받은 사람이 서명자의 공개키로 서명을 확인합니다.
서명을 한 메시지나 파일이 서명을 한 이후 어떤식으로든 변경되면 서명 확인이 실패합니다. 따라서 자료가 의도치 않게 변경되었다는 것을 알 수 있게 됩니다.
서명이 일치하지 않는다는 것은 꼭 누군가가 자료를 악의적으로 변경했다는 것을 의미하지는 않습니다. 단순히 전송 과정에서 문제가 좀 있었던 것일 수도 있습니다. 하지만 중간에 뭔가 바뀌었다는 것은 알 수 있습니다. 이것이 서명의 목적입니다.
공개키를 들여오기할 때 키 지문을 잘 확인해야 한다고 했습니다. 그래야 받아온 공개키가 정말로 여러분이 공개키의 주인이라고 생각하는 사람으로부터 온 것인지 알 수 있기 때문입니다. 공개키의 출처를 믿는다면 서명 일치 여부도 믿을 수 있겠습니다. 믿는 키로부터의 서명이 확인된다면 이 키의 주인으로부터 받은 메시지와 자료 또한 신뢰할 수 있습니다.
디지털 서명은 또한 주고받은 메시지나 자료의 내용이 무엇이든 서명자가 직접 서명했다는 것을 부정할 수 없게 하는 효과가 있습니다. 이것 또한 알아두셔야 합니다. 즉, 디지털 서명은 해당 개인키의 주인이 이 메시지/자료를 만들었고 서명이 이루어진 시점에서 더 이상 수정이 이루어지지 않았다는 보증인 셈입니다. 다시 한 번 강조하지만 개인키를 잘 보호해야 하는 이유가 이것입니다. 처음에 마스터 키를 생성하고 바로 이어서 폐기 인증서를 생성하고 잘 보관하라고 했던 이유 또한 이것입니다. 만약 개인키가 못 쓰게 되거나 유출되면 즉시 폐기해야 합니다. 만약 해커가 개인키 파일과 암호를 손에 넣었다면 기본적으로 그 사람이 하는 일은 여러분이 하는 일이나 마찬가지가 되는 것이기 때문입니다.
또 한 번 강조합니다. 개인 키의 암호는 최대한 길고 예측하기 어렵게 설정하십시오. Diceware를 다시 한 번 추천합니다. 요즘 개인 컴퓨터의 성능으로도 짧은 암호는 생각보다 빨리 알아낼 수 있습니다.
서명하기
gpg로 하는 서명에 사용되는 옵션은 방식에 따라 (-s, --sign
), --clearsign
, 그리고 (-b, --detach-sign
) 세 가지 종류가 있습니다.
-s, --sign
기본 사인 방식은 서명을 결과 파일 안에 집어넣고 자체적으로 압축을 합니다. 결과 파일은 압축을 하기 때문에 무조건 바이너리 형식입니다.
$ gpg2 -o signedmessage.txt.gpg --sign message.txt
이 방식으로 서명을 하면 원본 자료를 gpg로 복원을 해야 사용할 수 있다는 특징이 있습니다.
--clearsign
이 방식은 특히 텍스트 메시지를 서명할 때 유용합니다. 이메일, 문자로 메시지를 보내거나 게시판에 글을 올릴 때 서명을 하고 싶으면 이 옵션을 사용합니다. 메시지 자체는 서명 형식 안에 수정되지 않은 상태로 기록됩니다.
Clearsign을 한 메시지는 이렇게 생겼습니다:
$ gpg2 -o signedmessage.txt.asc --clearsign message.txt
...
$ cat signedmessage.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
this is a secret message!
-----BEGIN PGP SIGNATURE-----
iQIcBAEBCAAGBQJYRU3sAAoJEOTA4dVcFs1vyYgQAJ8vj7EjWCJUDEAWoAp3/AoH
s+B4ELtAu58fGM4g2T/CabBLtXdZIOuDvgZelZH938qvJKVxUd6Efpv3qvfuxCoA
mn9ubmARM3OmvFXbAb0tud/qRFnaTfFfCKBL3P5IIGDA8ai07Q0bubYS00CvUqbS
...
MqyjCfNuwPpWQfX4vXsEDxO+x1R7+WNCvaLsarTNV9lFLHw3U5C0bYUbylayqIKj
wYMbl+v7U4TpIBb/U8V37EZaoGJT20NYo/SHUGjfIYJOvFWapFxPOqN26RWqe4UO
aHBu+emEJDLsb6Vna5VD
=R9P+
-----END PGP SIGNATURE-----
-b, --detach-sign
위 두 방식의 서명은 원본 자료가 어떻게든 변환된다는 특징이 있습니다. 그래서 서명된 자료를 바로 사용하지 못 할 수 있습니다. 경우에 따라 이런 특징이 방해가 될 때가 있습니다.
Detached signature는 서명을 원본 메시지와 분리해서 따로 생성합니다. 따라서 서명을 확인한 뒤 원본 파일을 바로 사용할 수 있습니다. 자료가 실행 파일이나 워드 파일 등 서명 자료가 파일 안에 포함되어 있으면 곤란한 경우에 사용하면 좋습니다.
여러 웹 사이트에서 자료를 제공할 때 이 방식으로 자료에 서명을 해서 배포하고 있습니다. 해당 업체의 공개키를 가지고 있다면 서명 일치 여부를 확인할 수 있고 따라서 다운로드 받은 자료가 완전하다는 것을 알 수 있습니다.
또는 SHA–1과 같은 단방향 해시 값을 같이 게시하는 경우도 있습니다. 이 방식은 gpg를 이용하지는 않지만 자료의 완전성을 입증할 수 있는 또 다른 방식입니다. 이 또한 알아두시면 좋을 것 같습니다.
Detached signature는 이렇게 사용합니다:
$ gpg2 -o message.sig -b message.txt
이렇게 하면 message.sig 파일이 생성됩니다. 이 파일이 message.txt 파일에 대한 전자 서명입니다.
서명 확인하기
서명을 하는 방법을 알았으니 서명을 확인하는 방법을 알아보겠습니다.
서명을 확인하려면 --verify
옵션을 사용하면 됩니다.
--sign
과 --clearsign
으로 서명된 자료는 --verify
옵션으로 서명만 확인할 수도 있고, --decrypt
옵션으로 서명을 확인하고 동시에 자료를 원본으로 변환할 수도 있습니다.
이렇게 하면 서명 일치 여부만 알려줍니다:
$ gpg2 --verify signedmessage.txt.gpg
이렇게 하면 원본 파일을 생성하고 서명 일치 여부도 같이 알려줍니다:
$ gpg2 -o message.txt --decrypt signedmessage.txt.gpg
--detach-sig
의 경우 원본 파일과 서명 파일이 함께 있어야 검증할 수 있습니다.
이렇게 서명 파일과 원본 파일 순서로 적어주면 됩니다:
$ gpg2 --verify message.sig message.txt
서명 확인 결과가 gpg: Good signature from
와 같이 나오면 서명이 확인된 것입니다.
암호화와 서명은 동시에 할 수 있습니다. 예를 들면 이렇습니다:
$ gpg2 -aser John -r Park -r ... -o message.txt.asc message.txt
이렇게 하면 받는 사람은 복호화를 하면서 서명 일치 여부를 확인하게 될 것입니다.
이것으로 gpg의 가장 기초적인 사용 방법을 알아봤습니다. 지금까지 배운 내용으로도 충분히 gpg를 이용해 안전하게 자료를 주고받고 개인 자료를 암호화 할 수 있습니다.
다음 포스트부터는 키 서버를 통해 공개키를 배포하는 방법, 서브키 사용법, 키 id를 관리하는 방법, --edit-key
프롬프트 사용법 등을 다루도록 하겠습니다.
'GnuPG' 카테고리의 다른 글
GPG 자료 암호화/복호화하기 (1) | 2016.12.05 |
---|---|
GPG 공개키 주고받기 (0) | 2016.12.05 |
GPG 키 생성하기 (1) | 2016.12.03 |
GPG를 사용하는 이유 (0) | 2016.11.24 |
GPG 설치하기 (0) | 2016.11.23 |
- Total
- Today
- Yesterday
- pgp
- xCloud
- Game
- psremoteplay
- GnuPG
- GPG
- 유니콘
- Encryption
- GNU
- Signature
- cloudgaming
- Privacy
- xbox remote play
- XBOX
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |