레이블이 안드로이드인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드인 게시물을 표시합니다. 모든 게시물 표시

2010년 6월 23일 수요일

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

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

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

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

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

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


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

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

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

2009년 12월 6일 일요일

안드로이드 시작하기

임베디드 개발 플래폼의 대세가 안드로이드가 될 것임을 너무 늦게 - 모두가 다 알아챈 후에 - 깨닫게 되었다. 늦었지만 지금이라도 시작하지 않으면 곤란해질 것임을 느끼면서, 일단 안드로이드 이미지 빌드부터 시도해 보기로 한다.

1. 리눅스 설치

안드로이드 커널 컴파일을 위해서 노트북에 우분투를 설치하여 시도하기로 한다. 마침 ubuntu 9.10 iso 파일이 있으므로, VirtualBox에 우분투 9.10을 아래와 같이 설치한다. 안드로이드 커널 컴파일에 시간이 오래 걸리고 꽤 많은 용량이 필요하다고 하므로, 메모리와 하드 디스크를 넉넉하게 할당하였다.

호스트 컴퓨터는 Windows7-64bit-Pro 이다.
- Memory : 2G
- HardDisk : 25G

2. 커널 컴파일 따라하기

일단 아는게 없으므로, 인터넷을 찾아본다. 일단은 아래 국내 사이트에서 정보를 조금 얻을 수 있었다.
http://www.kandroid.org/
http://forum.falinux.com/zbxe/
http://www.androidpub.com/


하지만, 빌드는 공식 사이트를 참고한다.
http://source.android.com/download

영어라 편하지는 않지만, 구글이 제공하는 동영상과 슬라이드 자료에서 가장 정확하고 많은 정보를 얻을 수 있었다.
http://source.android.com/documentation

특히 Anatomy & Physiology of an Android 동영상 및 강연 자료가 나의 궁금증을 가장 속 시원히 풀어주었다.

만일 플래폼 빌드보다 안드로이드 어플리케이션에 더 관심이 많다면 아래 사이트를 참조하자.
http://developer.android.com/

아래는 이미지 빌드를 시도하면서 얻은 몇가지 정보 사항이다.
- JDK 5.0 update 12 or higher가 필요하다. 하지만 JDK 6.0은 지원하지 않는다.
- 15G HDD, 512MByte에서도 빌드에 성공하였다.
- .bashrc에 아래와 같이 path를 지정(Repo를 설치한 디렉토리에 대한 path임)
export PATH="~/bin:$PATH"

가장 큰 문제는 apt-get install시 sun-java5-jdk 패키지를 찾지 못하는 것었다.
JDK 5.0을 수동으로 설치할 수도 있겠지만, 아래 사이트에서 쉬운 해결책을 찾을 수 있었다.
http://www.androidpub.com/android_porting_info/38814

간단히 설명하면,
1. /etc/apt/sources.list에 아래 두줄을 추가.
deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
2. sudo apt-get update 실행
3. sudo apt-get sun-java5-jdk 실행

그 외에는 큰 문제 없이 빌드가 성공!!!

일단 첫 발에 의미를...

참고:
만약 java 1.6와 java1.5를 모두 설치하였다면 아래 명령으로 java 1.5를 사용하도록 지정할 수 있다.

sudo update-java-alternatives -s java-1.5.0-sun