반응형
iOS에서 SQL Cipher 사용하는 방법
SQL Cipher는 database 전체를 암호화해주는 오픈소스 라이브러리이다.
목차
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
참고) 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
Reference
- SQLCipher : https://www.zetetic.net/sqlcipher/
- SQLCipher Tutorial : https://www.zetetic.net/sqlcipher/ios-tutorial/
반응형
'iOS > Swift + Objective-c' 카테고리의 다른 글
[Swift] UITabBarController 이미지 설정 (0) | 2022.08.29 |
---|---|
[Swift] FileManager로 디바이스에 파일 저장하기 (Document) (0) | 2022.08.04 |
[Objective-c] NSMutableArray에 CGPoint 넣고 빼기 (NSValue) (0) | 2022.06.15 |
[Swift / Obejctive-c] UIView를 UIImage로 변환하기 (render UIView to UIImage) (0) | 2022.06.14 |
[Swift/Objective-c] 타이머 사용하기, 반복 작업하기 (Timer) (1) | 2022.03.03 |