2010년 6월 23일 수요일

공개키 암호와 안드로이드 서명

컴퓨터 세계에서 공개키 암호를 사용하는 이유는 크게 두 가지로 나눌 수 있는데, 첫번째는 데이터를 보내는 사람을 확인하기 위함이고, 두번째는 데이터를 받는 사람을 확인하기 위함이다.

데이터를 보내는 사람을 확인:  전자서명용
특정인을 사칭하지 못하도록 하기 위함이며, 대표적인 사용 예로는 공인 인증서가 있다.
공인 인증서의 경우, 사용자는 제 3기관에서 발행한 공개키와 개인키 쌍을 발급 받으며, 이 중 공개키는 거래를 원하는 금융기관에 등록한다. 이 후 금융 거래 시 개인키로 암호화 된 개인 서명을 금융기관에 보내면, 금융기관은 이를 공개키로 풀어 개인 서명을 확인한다. 다른 사람의 개인키로 암호화한 전자 서명은 금융기관에 등록 된 공개키로는 풀리지 않으므로, 타인의 사칭을 막을 수 있다.  또다른 예는 ActiveX로 악의적 코드가 다른 회사나 개발자를 사칭하여 배포되지 않도록 전자 서명을 사용한다.

데이터 암호화: 데이터를 보내는 사람의 개인키 사용
데이터 복호화: 데이터를 보내는 사람의 공개키 사용

데이터를 받는 사람을 확인:
보내는 데이터를 안전하게 특정 수신인에게만 전달 되도록 하기를 원하는 경우이다.  이 경우 데이터를 받으려는 사람이 공개키와 개인키 쌍을 생성해서 공개키를 데이터를 보내주는 사람에게 전달하고, 데이터를 보내는 사람은 이 공개키를 사용하여 데이터를 암호화 한다. 이제 암호화된 데이터는 암호시 사용된 공개키와 쌍을 이루는 개인키를 사용하여야만 해독할 수 있으므로, 데이터 중간에 누군가 가로채어도 내용을 알 수 없게 된다.

데이터 암호화: 데이터를 받는 사람의 공개키 사용
데이터 복호화: 데이터를 받는 사람의 개인키 사용


안드로이드 애플리케이션 서명 - 데이터를 보내는 사람을 확인:
안드로이드에서는 애플리케이션 등록자를 확인하기 위해서 애플리케이션을 안드로이드 마켓에 등록할 때 애플리케이션에 전자 서명을 하여 제출하여야 한다. 이를 위해 개발자는 keytool이라는 프로그램을 사용하여 공개키/개인키 쌍을 생성하고 이 중 개인키를 애플리케이선에 전자 서명을 하기 위해서 사용 한다.  공개키는 애플리케이션을 배포할 때 함께 배포하며, 이는 애플리케이션이 설치될 때 개인키로 암호화 된 전자 서명을 확인하기 위해서 사용된다. 이로써 누군가 특정 개발자를 사칭하여 악성 코드를 배포할 수 없게 된다.

참고
1. keytool로 생성된 공개키/개인키 쌍은, 암호(패스워드)로 보호되며 key store라고 불리는 파일에 저장된다.
2. 애플리케이션에 전자 서명은 jarsigner라는 명령으로 할 수 있다. jarsigner명령 수행시 인자로 공개키/개인키가 저장되어 있는 keystore 파일과 서명을 원하는 애플리케이션 패키지 파일(*.apk)을 넘겨주게 된다. 안드로이드 1.5이상에서는 jarsigner를 직접 사용하지 않고 Eclipse안에서 서명을 수행할 수 있다.

뱀다리
혹시 왜 암호와 복호 모두에 사용 가능한 하나의 비밀키를 사용하지 않고 키를 공개키와 개인키로 나누는지 이해가 되지 않는가?  이는 비밀키의 경우 키를 전달 할 때  키가 제 3자에게 누출되는 것을 막을 수 없기 때문이다.(인터넷으로 키가 전송되는 경우를 생각해 보자)  암호와 복호에 동일한 키가 사용될 경우 3자에게 해당 키가 누출되면 더이상 데이터 보안이 불가능해 진다.  공개키/개인키를 사용할 경우 공개키는 전달되는 과정에서 3자에게 누출되어도 상관없으며, 개인키는 개인이 보관하며 타인에게 전송하지 않으므로 누출되지 않도록 해야 한다. 또한 개인키는 일반적으로 비밀키로 한번 더 암호화 하여 보관한다.즉 개인키를 가진 사람만 데이터 복호화가 가능하다.(데이터를 받는 사람을 확인하는 경우, 데이터를 보내는 사람을 확인하는 경우라면, 개인키를 가진 사람만 데이터 암호화(전자서명)이 가능)

댓글 없음: