fc2ブログ

[iPhone]sqlcipherを利用する。(その2)

http://otuji.blog97.fc2.com/blog-entry-213.html
以前の記事に誤りがあったため修正の意味を含めて新たな記事で
メモを残します。

iPhoneの内部DBを暗号化するためにsqlcipherというツールがある。
どうも日本語のよいチュートリアルが見つからなかったのでこれを利用するための手順をメモしておく。

【環境】
Mac OS X 10.7.5

【前提】
1.Xcodeがインストールされている事。
※4.2で確認
2.「.tar.gz」、「.zip」が解凍できる事。

【手順】
1.作業用の適当なフォルダを作成する。

~/Documents/xcode_workspace/sqlcipher/

2.下記URLから「openssl-1.0.1c.tar.gz」を作業用フォルダにダウンロードする。
ftp://ftp.openssl.org/source/

3.下記URLから「sqlcipher-openssl-xcode-d265b64.zip」を作業用フォルダにダウンロードする。
[雲のマークZIP]をクリックでダウンロードできる。
https://github.com/sqlcipher/openssl-xcode

4.下記URLから「sqlcipher-sqlcipher-v2.0.6-0-g6dbdd46.zip」を作業用フォルダにダウンロードする。
[雲のマークZIP]をクリックでダウンロードできる。
https://github.com/sqlcipher/sqlcipher

5.上記、2.3.4.でダウンロードしたものを解凍する。
※The Unarchiverなんかがあると便利。

6.「openssl-1.0.1c」の中身を「sqlcipher-openssl-xcode-d265b64」にコピーする。

7.「OPENSSL_SRC」のパスを指定する。
上部メニューのXcode=>Preferenceのメニューを開き
開いたウインドウのLocationsのSoure Treesを開く。
そこで下記の通り設定を追加する。
Display Name:OPENSSL_SRC
Setting Name:OPENSSL_SRC
Path:「openssl-1.0.1c」の絶対パス

8.sqlcipherを利用するプロジェクトを作成する。
今回は新規にsqlcipherTestプロジェクトを、
Single View Applicaitonで作成する。
場所は1.で作成したフォルダ内。

9.「sqlcipherTest」プロジェクトを開き、プロジェクトに、
 opensslプロジェクト、sqlcipherプロジェクトを追加する。

10.「openssl」プロジェクトのBase SDKをLatest iOSを選択する。

11.「sqlcipher」プロジェクトのBase SDKをLatest iOSを選択する。

12.ビルドの依存関係を設定する。
 sqlcipherTestのTARGETSのsqlcipherTestから、
 Build Phasesを選択し、Target Dependenciesに
 「sqlcipher」、「crypto」を追加する。

13.Link Binary With Librariesに設定を行う。
 「libcrypto.a」「libsqlcipher.a」を追加する。
 「libsqlite3.dylib」が含まれている場合は取り除く。

14.build architecturesを必要に応じて変更する。

15.マクロを追加する。
 「Other C Flags」のdebugとreleaseに「-DSQLITEHASCODEC」
 を追加する。

16.下記コードを「ViewController.m」の「viewDidLoad」に追加する。

#import

...
NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent: @"sqlcipher.db"];
sqlite3 *db;
if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
const char* key = [@"BIGSecret" UTF8String];
sqlite3_key(db, key, strlen(key));
if (sqlite3_exec(db, (const char*) "CREATE TABLE testtable(id number(009, 0) primary key,item number(009, 0) );", NULL, NULL, NULL) == SQLITE_OK) {
// password is correct, or, database has been initialized
NSLog(@"SQLITE_OK");

} else {
// incorrect password!
NSLog(@"SQLITE_NG");
}
if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
// password is correct, or, database has been initialized
NSLog(@"SQLITE_OK");

} else {
// incorrect password!
NSLog(@"SQLITE_NG");
}

sqlite3_close(db);
}

17.iPhone Simulatorを選択して実行する。

18.作成された.dbファイルを確認する。
 下記のフォルダにcdで移動する。
/Users/sjlombardo/Library/Application Support/iPhone Simulator/5.0/Applications//Documents

下記コマンドで内容が暗号化されているか確認する。
% hexdump -C sqlcipher.db

【参考URL】
http://sqlcipher.net/ios-tutorial
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

[iPhone]UIDatePickerのメモ(自分用)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CGRect frameForWindow = [[UIScreen mainScreen] bounds];
_window = [[UIWindow alloc] initWithFrame:frameForWindow];

//アプリのウインドウと同じサイズの四角形を取得
CGRect rect = CGRectMake(0.0, 20.0, 320.0, 460.0);

//上記で取得したサイズのピッカーを作成
picker_ = [[UIDatePicker alloc] initWithFrame:rect];

NSDate *date = [NSDate date];

[picker_ setDate:date animated:NO];
[picker_ setMinimumDate:date];
[picker_ setMaximumDate:[NSDate dateWithTimeIntervalSinceNow:3600*24*365]];
[picker_ setCalendar:[NSCalendar currentCalendar]];
[picker_ setTimeZone:[NSTimeZone systemTimeZone]];

[_window addSubview:picker_];

// [picker release];


// 標準ボタン例文
btn_ = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn_.frame = CGRectMake(100, 300, 100, 30);
[btn_ setTitle:@"押してね" forState:UIControlStateNormal];
[btn_ setTitle:@"ぽち" forState:UIControlStateHighlighted];
[btn_ setTitle:@"押せません" forState:UIControlStateDisabled];
// ボタンがタッチダウンされた時にhogeメソッドを呼び出す
[btn_ addTarget:self action:@selector(pushBtn:)forControlEvents:UIControlEventTouchDown];
[_window addSubview:btn_];

// [btn release];

[_window makeKeyAndVisible];

return YES;
}
- (void)pushBtn:(UIButton*)button{
NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
[inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
NSString *intputDateStr = @"2012/09/02 03:04:05";
[inputDateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
[inputDateFormatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]];
NSDate *inputDate = [inputDateFormatter dateFromString:intputDateStr];

[inputDateFormatter release];

[picker_ setDate:inputDate animated:YES];

NSLog(@"picker_ => %@",[picker_ description]);
NSLog(@"picker_.date => %@",[picker_.date description]);
NSLog(@"picker_.minimumDate => %@",[picker_.minimumDate description]);
NSLog(@"picker_.maximumDate => %@",[picker_.maximumDate description]);
NSLog(@"picker_.calendar => %@",[picker_.calendar description]);
NSLog(@"picker_.timeZone => %@",[picker_.timeZone description]);
}

UIDataPickerのdateは本体のカレンダー設定にどうしても引きずられるようです。
それはどうしようもなさそう。。
設定するdateはフォマッタで文字列の与える文字列のフォーマットを
カレンダーとフォーマットストリングで指定してあげればよい。

テーマ : プログラミング
ジャンル : コンピュータ

[iphone]UIDatePickerのメモリリーク

http://blog.livedoor.jp/second_flush/archives/51138977.html
こちらのページでUIDatepickerでメモリリークが発生するとのことでしたので、
どのようなメモリリークが発生するかをLeaksで調べてみました。

・確認環境
Mac OS X 10.7.4
Xcode 4.4.1
iPhone Simurator 5.1


プロジェクトをempty applicationで作成し、
下記の部分のみ修正する。

AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CGRect frameForWindow = [[UIScreen mainScreen] bounds];
_window = [[UIWindow alloc] initWithFrame:frameForWindow];

//アプリのウインドウと同じサイズの四角形を取得
CGRect rect = [_window frame];

//上記で取得したサイズのピッカーを作成
UIDatePicker* picker = [[UIDatePicker alloc] initWithFrame:rect];

[_window addSubview:picker];

[picker release];

[_window makeKeyAndVisible];

return YES;
}

で表示されたUIDatePickerをくるくる回していると下記のようなメモリリークが発生した。

メモリリーク  

Leaksの間違いなのか、実際に提供されているframework内でリークしているのか、
それとも使い方が間違っているのか。。



続きを読む

テーマ : プログラミング
ジャンル : コンピュータ

[iPhone]sqlcipherを利用する。(その1)

認識に誤りがありました。
こちらの記事を参照してください。
http://otuji.blog97.fc2.com/blog-entry-220.html

iPhoneの内部DBを暗号化するためにsqlcipherというツールがある。
どうも日本語のよいチュートリアルが見つからなかったのでこれを利用するための手順をメモしておく。

最初はlibcrypto.a、libssl.aを作成するところまで。

【前提】
1.Xcodeがインストールされている事。
※4.3.3で確認
2.「.tar.gz」、「.zip」が解凍できる事。

【手順】
1.下記URLから「openssl-1.0.1c.tar.gz」をダウンロードする。
ftp://ftp.openssl.org/source/

2.下記URLから「sqlcipher-openssl-xcode-d265b64.zip」をダウンロードする。
[雲のマークZIP]をクリックでダウンロードできる。
https://github.com/sqlcipher/openssl-xcode

3.上記、1.2.でダウンロードしたものを解凍する。
※The Unarchiverなんかがあると便利。

4.適当な場所にビルド用のフォルダを作成する。

5.作成したフォルダ内に上記3.で解凍してできたフォルダ内のファイルを、
 すべてコピーする。

6.フォルダ内の「openssl.xcodeproj」を実行する。

7.Project navigaterでプロジェクトファイルを選択し、
 TARGETのcryptを選択し、
 BaseSDKをiOS SDKの適切なバージョンに変更する。

8.Buildを実行する

9.上記「4.」で作成したフォルダ直下にlibcrypto.a、libssl.aが作成される。
※projectを起動した際にファイルをプロジェクトに追加しないのがコツのようです。

テーマ : セキュリティ
ジャンル : コンピュータ

プロフィール

乙寺

Author:乙寺
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード