SQLCiper를 통한 안드로이드Sqlite 데이터베이스 암호화 하기
요즘 하도 보안보아 하니까, 내가 가진 정보를 다른 사람에게 특히 나쁜의도를 가진 사람에게 보여주거나 하지 않기 위해서 암호화라는 것을 많이 선택하게 된다.
나도 이런 상황에서 sqlite 데이터베이스를 안드로이드에서 사용하기 위해서는 어느정도 데이터베이스를 암호화 하고 향후에는 암호화 비밀번호도 동적으로 생성하는 것으로 바꾸려는 원대한 꿈을 가지고 프로젝트에 암호화된 데이터베이스를 집어넣는 작업을 했다.
문제라고 한다면 기존 안드로이드 sqlite API가 아닌 커스텀 데이터베이스 연결 라이브러리를 사용해야 하고, 업데이트라던지 버전관리를 다름아닌 내가 해야 한다는 것이다. 이건 다름아닌 유지보수의 이슈가 아닐까 하긴 하는 데... 하지만 잘만 관리하게 된다면 최신 기능의 암호화 된 sqlite 데이터베이스를 내 앱에 장착 할 수 있는 기쁨 같은 것도 있다.
원래 사용하던 라이브러리는 github에서 검색해서 다음 라이브러리1를 사용해서 안드로이드애플리케이션을 만들었다.
근데 문제가 생겼는 데, 그 문제라는 것이
- 로컬 PC나 해당 안드로이드 OS에서 데이터베이스를 생성해야 하는 데, 그럴려면 직접 데이터를 생성하는 라이브러리를 만들어야 한다는 것이다.
- 또, 데이터를 생성한 다음에 다시 암호화 하는 라이브러리도 만들어야 했고,
- 디버깅을 위해서 사용자 데이터베이스를 열어볼 수 있도록 암호화를 푸는 라이브러리도 만들어야만 했다.
그렇게 만들다 보니.. 관리도 힘들어지고 해서 데이터베이스 생성기 같은 라이브러리 소스도 많이 지고, 기능도 만만치 않게 되었다.
그래서 눈물을 머금고 다시 인터넷을 뒤지다 보니 Sqlite browser 라는 것이 있다는 것을 알게 되었다. 이 툴로 암호화를 데이터를 생성한 다음 바로 만들어 줄 수 있다는 것이 정말 큰 매력이었다.
이를 위해서 호환되는 암호화 라이브러리가 바로 SqlCiper 2였다는 것.
그래서 나중에 어떻게 되던지 간에 이 라이브러리로바꾸어 보았으면 하는 맘에 오늘 시작하기로 한다.
그리고 내 github를 놀릴 수 없으니, 단순히 두 프로젝트를 합치기 위해서 다음과 같이 내 github에다가서브모듈을 만들었다. 대충 이런느낌이랄까?
마침 설치해 놓은 msys2와MinGW가 있으니 이를 사용해서 빌드 해보도록 한다. 그것도 윈도우 환경에서 말이다.
우선 openssl을 빌드 하여야 한다. 사실 만만한 작업이 아닌 듯….
따라서 위에서 보듯이 openssl이 하나 더 보일 것이다. 오래된 버전이기는 해도 없는 것보다 낫다. 그리고 어떻게 업데이트해서 사용하면 되는지도 README에 나와 있으니, 생각있으면 다시 한번 해보는 것도 나쁘지 않을 듯… 하니만 지금은 생각이 없다.
export NDK_HOME=/C/DEV/SDKs/android-ndk-r10d/
사진 설명을 입력하세요.
jni 디렉토리 아래Application.mk를 자신의 $NDK_HOME/toolchains/arm-linux-androideabi-XXXX 버전에 맞추도록 한다
https://wiki.openssl.org/index.php/Android#OpenSSL_Library
LOCAL_LDLIBS is always ignored for static libraries
cd /C/DEV/skens/mobile/skens_android_natives/SqliteCiper/android-database-sqlcipher
cd android-database-sqlcipher
export ANDROID_SDK=/C/DEV/SDKs/android-sdk/
export SDK_TOOLS=$ANDROID_SDK/tools
export ANDROID_NDK_ROOT=/C/DEV/SDKs/android-ndk-r10d/
export PATH=$SDK_TOOLS:$PATH
Sqlciper 설치
그런 다음 Sqlciper를 설치 하도록 한다.
git clone https://github.com/sqlcipher/sqlcipher.git
export SQLITE_HAS_CODEC
export SQLITE_TEMP_STORE=2
sudo yum install openssl
sudo yum install tcl-devel tk-devel
sudo yum install autoconf
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
make
sqlcipher --version
sudo make install
》make 과정에서 오류가 난다면, sqlite3.h 파일에아무것도 없는 빈 파일이기 때문에 그렇다.
그러므로 이 파일을 삭제하고 configure 부터 해주고 make 하면 된다.
(https://github.com/sqlcipher/sqlcipher/issues/157)
안드로이드용 Sqlciper 라이브러리 설치
export NDK_HOME =/home/tommybee/DEV/android/ndk/android-ndk-r10e
export TOOLS=$NDK_HOME/toolchains
export PATH=$PATH:$NDK_HOME
make init
make all
위와 같이 자신에 맞는 디렉토리가 설정만 되어 있으면 빌드하는 데는 별 무리가 없을 듯 하다.
라이브러리는 다음 정도면 될 듯하다.
Libcrypto.a 파일 같은 경우에는 없어도 되는 것 같은 데.. 혹시나 해서…넣어놓았다. 문서를읽어보아야 할 듯한데 용량에 문제가 없으면 그냥 사용 하는 것으로 한다.
사용법
package com.demo.sqlcipher;
import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import android.app.Activity;
import android.os.Bundle;
public class HelloSQLCipherActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InitializeSQLCipher();
}
private void InitializeSQLCipher() {
SQLiteDatabase.loadLibs(this);
File databaseFile = getDatabasePath("demo.db");
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database
= SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
database.execSQL("create table t1(a, b)");
database.execSQL(
"insert into t1(a, b) values(?, ?)",
new Object[]{
"one for the money",
"two for the show"
}
);
}
}
사용법은 별로 어렵지 않은 듯, 빨간 색 글자만 유의 하도록 한다. 아규먼트는 액티비티나 컨텍스트가 넘어가야만 한다. 액티비티나 컨텍스트내에서 만들 지 않을 거면 저장되어 있는 액티비티나 컨텍스트를 사용하도록 한다.
Sqlbrowser설치
이 툴은 윈도우 환경에서 빌드 할 경우에는 정말 머리 아픈일이 많이 생길 것 같은 느낌이 팍팍 들어서 리눅스에서는 다음과 같이 빌드 해준다.
(CentOS 7 64비트 기준)
sudo yum install qt-devel ant-antlr antlr-C++
cmake -G "Unix Makefiles" -Dsqlcipher=1 .
Policy CMP0037 is not set
make
make install
오류가 나는 데 그건 다음과 같이 잡아 준다.
CMakeList.txt 파일 내의 프로젝트 이름을
"DB Browser for SQLite" 에서 "sqlitebrowser"로 바꿔준다. #project("DB Browser for SQLite") 를 #project("sqlitebrowser") 정도로 바꿔주면 될 듯… |
윈도우 용으로는 그냥 http://sqlitebrowser.org/ 에서 바이너리를 다운받아 설치 하는 것으로 하는 것이 정신 건강에 좋을 듯..
이로써 두개의 암호화 할 수 있는 라이브러리를 가지게 되었다.
그리고하나는 바로 그 자리에서 바로 고쳐서 데이터베이스를 사용 할 수 있는 방식으로 개발이 가능 하다.
암호화도 하고
암호화된 데이터베이스도 그자리에서 열고,
위에서 해당 내용을 수정하고, 수정된 내용을 바로 반영 할 수 있는프로세스가 마련되었다.
사진 설명을 입력하세요.
이상.
'모바일프로그래밍 > 안드로이드' 카테고리의 다른 글
ProGuard를 통한 안드로이드 애플리케이션의 난독화 (0) | 2023.04.11 |
---|---|
이벤트 기반 아키텍처와 메시지 기반 아키텍처 (0) | 2023.04.02 |
[Android] MVP 접근 방식으로 상용구 코드를 줄여 봅시다 (0) | 2023.03.28 |
자신만의 Sqlite 설치하고 개발하기 (0) | 2023.03.23 |
디버깅 가능한 Android 애플리케이션 공격하기 (0) | 2023.03.07 |