iOS/Swift + Objective-c

[Objective-c] SQL Cipher 사용하여 db 암호화하는 방법

안경 쓴 귀니 2022. 6. 20. 21:24
반응형

iOS에서 SQL Cipher 사용하는 방법

SQL Cipher는 database 전체를 암호화해주는 오픈소스 라이브러리이다.

 

목차

1. SQL Cipher 사용 방법

2. 암호화 적용되었는지 실제 기기에서 확인하는 방법

 

1. SQL Cipher 사용 방법

1. framework 추가

Project > TARGETS > General > Frameworks, Libraries, and Embedded Content 이동 후 Security.framework 추가

 

 

2. CocoaPod 추가

pod 'SQLCipher', '~>4.0' 추가

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'SQLiteSample' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  pod 'SQLCipher', '~>4.0'

  # Pods for SQLiteSample

end

 

3. 코드 작성

1) 데이터베이스 열기

2) sqlite3_key 함수 사용하여 비밀번호 설정 - 데이터베이스 오픈 후 첫 번째로 진행해야 함

#import "sqlite3.h"

...
NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
                          stringByAppendingPathComponent: @"sqlcipher.db"];
sqlite3 *db;
sqlite3_stmt *stmt;
bool sqlcipher_valid = NO;

if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
    const char* key = [@"BIGSecret" UTF8String];
    sqlite3_key(db, key, (int)strlen(key));
    if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
        if(sqlite3_prepare_v2(db, "PRAGMA cipher_version;", -1, &stmt, NULL) == SQLITE_OK) {
            if(sqlite3_step(stmt)== SQLITE_ROW) {
                const unsigned char *ver = sqlite3_column_text(stmt, 0);
                if(ver != NULL) {
                    sqlcipher_valid = YES;
                    NSLog(@"ciper_version = %s", ver);
                    // password is correct (or database initialize), and verified to be using sqlcipher

                }
            }
            sqlite3_finalize(stmt);
        }
    }
    sqlite3_close(db);
}

 

반응형

2. 암호화 적용 되었는지 실제 기기에서 확인하는 방법

1. Documents 폴더에서 db 파일 조회

Documents 폴더 접근하는 방법을 모르는 경우는 아래 링크에서 확인하기

https://es1015.tistory.com/429

 

[iOS] 디바이스 내 앱 데이터 확인 (AppData, Documents)

디바이스 내 앱 데이터를 확인하는 방법 1. Xcode > Window > Devices and Simulators 선택 2. 왼쪽 Devices에서 디바이스 선택 > 앱 선택 > 톱니바퀴 > Download Container... 선택 3. 저장할 폴더 선택 4. 생..

es1015.tistory.com

 

참고) UserDB.db라는 db 파일에 데이터를 insert한 상태

 

2. 터미널에서 명령어 입력

터미널에서 해당 파일이 있는 위치로 이동한 후 아래 명령어를 입력한다.

$ hexdump -C <DB파일명>
예) hexdump -C UserDB.db

그러면 아래와 같이 암호화된 값으로 조회됨

00000000  62 3b 7c 24 6a 85 dc b4  52 34 f4 72 9e 82 6e 2e  |b;|$j.ܴR4?r..n.|
00000010  e5 dd fc 6f 44 ee 73 ec  ce 22 c2 a1 7b ea 27 2d  |???oD?s??"¡{?'-|
00000020  9e 2e 5e 99 c0 d2 6a 87  72 bd 56 94 e5 69 f6 fd  |..^.??j.r?V.?i??|
00000030  bc 75 87 43 00 44 e7 5d  4c 97 4e a3 a2 ee 73 72  |?u.C.D?]L.N???sr|
...
00002fe0  bd 8c 5e 66 e5 8f eb 48  ff 09 3e e4 e9 87 7c 68  |?.^f?.?H?.>??.|h|
00002ff0  6e ea 34 f2 cd b6 7a e5  50 75 e7 17 96 ec c0 b1  |n?4?Ͷz?Pu?..???|
00003000

 

참고용으로, SQLCipher를 사용하지 않았을 경우는 아래처럼 조회됨

00000000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
00000010  10 00 01 01 00 40 20 20  00 00 00 03 00 00 00 03  |.....@  ........|
...
00000f30  00 00 00 50 02 06 17 2b  2b 01 59 74 61 62 6c 65  |...P...++.Ytable|
00000f40  73 71 6c 69 74 65 5f 73  65 71 75 65 6e 63 65 73  |sqlite_sequences|
00000f50  71 6c 69 74 65 5f 73 65  71 75 65 6e 63 65 03 43  |qlite_sequence.C|
00000f60  52 45 41 54 45 20 54 41  42 4c 45 20 73 71 6c 69  |REATE TABLE sqli|
00000f70  74 65 5f 73 65 71 75 65  6e 63 65 28 6e 61 6d 65  |te_sequence(name|
00000f80  2c 73 65 71 29 79 01 07  17 15 15 01 81 55 74 61  |,seq)y.......Uta|
00000f90  62 6c 65 75 73 65 72 75  73 65 72 02 43 52 45 41  |bleuseruser.CREA|
00000fa0  54 45 20 54 41 42 4c 45  20 75 73 65 72 20 28 5f  |TE TABLE user (_|
00000fb0  49 4e 44 45 58 20 49 4e  54 45 47 45 52 20 50 52  |INDEX INTEGER PR|
00000fc0  49 4d 41 52 59 20 4b 45  59 20 41 55 54 4f 49 4e  |IMARY KEY AUTOIN|
...
00002ff0  00 00 00 00 00 00 08 01  03 15 01 75 73 65 72 02  |...........user.|
00003000

 

 

샘플 코드

 

https://github.com/eunsuu1015/ObjCSample/tree/main/SQLCipher

 

GitHub - eunsuu1015/ObjCSample

Contribute to eunsuu1015/ObjCSample development by creating an account on GitHub.

github.com

 

Reference

 

- SQLCipher : https://www.zetetic.net/sqlcipher/

- SQLCipher Tutorial : https://www.zetetic.net/sqlcipher/ios-tutorial/

 

반응형