IT_Programming/Dev Tools

XCode 4 with SQLCipher 1.1.8

JJun ™ 2011. 6. 7. 16:31

------------------------------------------------------------------------------------------------

출처: http://hyunjong.tistory.com/60

------------------------------------------------------------------------------------------------

 

Xcode 3에서 sqlcipher을 사용하셨던 분들은 2011년초가 악몽과도 같았을 겁니다.

sqlcipher가 xcode4에서 컴파일이 안되었기 때문이죠.

 

개발자인 sjlombardo님은 업글을 너무 여유롭게 하시더군요. 하지만 SQLCipher Google Groups에서 저를 포함한 많은분들의 징징거림으로 인하여 현재는 XCode4를 아주 잘 지원하고 있습니다.


까놓고 말해서 Xcode4에서도 특별하 변경없이 기존것을 사용할수는 있었는데,

개발자가 배포하는거에 비하면 저의 능력은 너무 떨어지기 때문에 사용하면서도 불안했거든요.

-_-;;;;

[준비물]
    - SQLCipher : https://github.com/sjlombardo/sqlcipher 
    - OpenSSL : http://www.openssl.org/source/
    - OpenSSL-XCode : https://github.com/sjlombardo/openssl-xcode
 
압축을 푸신 뒤 OpenSSL-XCode을 압축해제후 나오는  Xcode 프로젝트 파일과 문서 화일을 OpenSSL 소스 폴더에 복사해 놓으시면 됩니다.

1. Xcode4에서 SQLCipherTest라는 프로젝트를 생성한다.
2. XCode 4 Preference - Source Trees로 이동하여 OpenSSL과 SQLCipher의 경로를 설정한다.

[첨부 1]

 

 

 

 

3. sqlcipher와 openssl 프로젝트를 SQLCipherTest 프로젝트에 포함시킨다.

 

    [첨부 2]

 

4. SQLCipherTest - Target - Build Phases - Target Dependencies 로 이동하여 + 를 클릭한 뒤

    에 crypto와 sqlcipher를 추가한다.

  
   [첨부 3]

 

  
[첨부 4]
  

 

5. SQLCipherTest - Target - Build Phases - Link Binary With Libraries 로 이동하여 + 를

    클릭한 뒤에 libcrypto.a와 libsqlcipher.a를 추가한다.

    (빨강색와도 정상이다. 아직 컴파일이 안되었기 때문에 빨강색으로 나오는 것이다.)

 

[첨부 5]

 

 

6. SQLCipherTest - Target - Header Search Paths에 + 를 눌러서 경로를 추가한다.

 

   [첨부 6]

 


7. 테스트용 코드를 작성한다.
 #import "/usr/include/sqlite3.h"
- (void)sqliteTest
{
    sqlite3 *database;
    
    // Database file path
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    NSString *sqlfilePath = [documentDirectory stringByAppendingPathComponent:@"test.sqlite"];

    // Database open
    if (sqlite3_open([sqlfilePath UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");
    } else {
        sqlite3_exec(database, "PRAGMA key = 'InputYourPassword'", NULL, NULL, NULL);
    }
}


8. 에러 없다면 성공.

주의 1 - Xcode4에서는 빌드 디렉토리가 통합으로 관리되는데, 이것을 기존과 같이 사용하기 위해

             Xcode의 Preference를 변경하는 경우가 있다.

             이럴 경우에는 sqlcipher가 Library 디렉토리를 찾지 못하므로 디폴트 값을 사용하길

             권장한다. (Xcode - Preference - Locations - Build Location - Place build Products

                             in derived location (recommended))
 
주의 2 - 주의 1처럼 Build Location 을 변경하셨는데 잘 되시는분... 어떻게 하셨는지 알려주세요.

             제가 하면 시뮬일 때랑 디바이스때랑 항상 라이브러리 경로를 지정해 주어야만 정상적으로

             실행이 되더군요.

 

 

더보기

출처: http://blog.naver.com/sfmelon?Redirect=Log&logNo=60114082882 

 

 

iPhone에서는 SQLite3 를 사용하면 쉽게 데이타의 조작이 가능하다.
iPhone 앱의 특성상 모든 리소스는 *.app 아래에 파일로 그대로 풀리기 때문에 탈옥폰에서는 리소스가 그냥 오픈되어 버린다는 단점이 있고, SQLite3를 사용한 db 파일 역시 마찬가지다.


이런 경우, DB에 패스워드를 걸거나 암호화 하면 좋겠지만, 기본으로 제공되는 SQLite3에는

그런기능은 없다. 검색해보니 GitHub에서 Open Source로 배포하는 SQLCipher가 그 역할을 대신 해 줄 수 있겠다.


sqlite3의 인터페이스를 SQLCipher의 그것으로 대체하여 사용하면 암호화/복호화가 가능하다.

 

 

설정하는 방법은 다음과 같다.

1) SQLCipher를 다운로드 한다.

2) 적당한 곳에 풀어 놓고, 빌드 한다. (빌드 방법은 SQLCipher README 참조)
    → 이렇게 빌드 하면 sqlite3의 커맨드를 SQLCipher로 사용할 수 있다. (아주 유용!)


3) OpenSSL을 다운로드하고 프로젝트에 연결한다. (MobileOrchard의 Tutorial 참조)
    - OPENSSL_SRC, SQLCIPHER_SRC 소스디렉토리 설정 (Xcode -> Preferences)

    - 두 프로젝트 추가

    - Dependency 설정, Library 포함

    - Header Path에 OPENSSL_SRC, SQLCIPHER_SRC 추가


OpenSSL과 SQLCipher의 Xcode Project는 여기서 다운로드한다.

https://github.com/sjlombardo/sqlcipher 

https://github.com/sjlombardo/openssl-xcode 



코드(또는 커맨드)에서는
1) DB를 생성하고 (기존 DB는 암호화가 되지 않는다)

2) 다른 커맨드(또는 함수)를 호출하기 전에 "PRAGMA key='****'" 커맨드 또는 sqlite3_key()

    함수를 호출한다.


3) 이 이후 생성되는 모든 DB 정보는 암호화 되어 저장된다.

4) 암호화된 DB를 오픈할 때도 다른 커맨드를 호출하기 전에 "PRAGMA key='****'" 커맨드

    또는 sqlite3_key() 함수를 먼저 호출해야 한다.

 


 

* XCode 4 적용시에는!

openssl 과 sqlcipher 프로젝트가 다른창에 열려있다면 dependency 설정이 불가능하니

창을 닫고 진행해야 한다. (다른 프로젝트창에서 끌어다 넣었다면 프로젝트를 다시 여는 것이

좋다.

(이 시점에서 Xcode가 크래쉬될 수 있으며, 그렇게 된 후에는 계속 뭔가를 추가 할 때마다

 그런 현상이 생긴다. 그리고 그렇게 된 후에는 일찌감치 기존 프로젝트 파일은 버리고

 새로 프로젝트를 만들어야 한다.)