この質問では、iPhoneでのデータの暗号化について説明します crypt()関数を使用します。別の方法として、iPhoneにキーチェーンはありますか。もしあれば、ログインの詳細を保存してアプリケーションで取得するために、それにアクセスするためにどのコードを使用しますか?
使用できるキーチェーンがあります。コードについては、AppleのGeneric Keychainサンプルアプリケーションをチェックすることをお勧めします。
注意すべきもう1つのこと:古いバージョン(2.x、3.x)のiPhone SDKを使用している場合、キーチェーンAPIはシミュレーターで機能しません。これにより、テスト時のフラストレーションを大幅に節約できます。
キーチェーンにキーと値のペアを格納するために使用するものを以下に示します。プロジェクトにSecurity.frameworkを必ず追加してください
#import <Security/Security.h>
// -------------------------------------------------------------------------
-(NSString *)getSecureValueForKey:(NSString *)key {
/*
Return a value from the keychain
*/
// Retrieve a value from the keychain
NSDictionary *result;
NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecReturnAttributes, nil] autorelease];
NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, kCFBooleanTrue, nil] autorelease];
NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys];
// Check if the value was found
OSStatus status = SecItemCopyMatching((CFDictionaryRef) query, (CFTypeRef *) &result);
[query release];
if (status != noErr) {
// Value not found
return nil;
} else {
// Value was found so return it
NSString *value = (NSString *) [result objectForKey: (NSString *) kSecAttrGeneric];
return value;
}
}
// -------------------------------------------------------------------------
-(bool)storeSecureValue:(NSString *)value forKey:(NSString *)key {
/*
Store a value in the keychain
*/
// Get the existing value for the key
NSString *existingValue = [self getSecureValueForKey:key];
// Check if a value already exists for this key
OSStatus status;
if (existingValue) {
// Value already exists, so update it
NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, nil] autorelease];
NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, nil] autorelease];
NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease];
status = SecItemUpdate((CFDictionaryRef) query, (CFDictionaryRef) [NSDictionary dictionaryWithObject:value forKey: (NSString *) kSecAttrGeneric]);
} else {
// Value does not exist, so add it
NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrGeneric, nil] autorelease];
NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, value, nil] autorelease];
NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease];
status = SecItemAdd((CFDictionaryRef) query, NULL);
}
// Check if the value was stored
if (status != noErr) {
// Value was not stored
return false;
} else {
// Value was stored
return true;
}
}
ユーザーがアプリを削除しても、これらのキー/値は削除されないことに注意してください。ユーザーがアプリを削除してから再インストールした場合でも、キー/値にはアクセスできます。
私は本当に バズアンダーソンのキーチェーンアブストラクションレイヤー が好きで、使用可能な状態になるまで Jens AlfkeのMYCrypto を心待ちにしています。後者は、Mac OS XとiPhoneで同じコードを使用できるようにするという有能な仕事をしますが、その機能はキーチェーンのごく一部を模倣しているだけです。
また、AppIDを生成するときに、複数のアプリケーションが同じキーチェーン情報にアクセスするようにしたい場合は、ワイルドカードAppID(#####。com.prefix。*)...を生成する必要があることも覚えておいてください。
GenericKeychainサンプルの最新バージョン1.2を使用すると、Appleは、iPhoneシミュレーターでも実行されるキーチェーンラッパーを提供します。詳細については、この記事をチェックしてください。 http:// dev-metal .blogspot.com/2010/08/howto-use-keychain-in-iphone-sdk-to.html
これがMr.Granoffのもう1つの優れたラッパークラスです https://github.com/granoff/Lockbox ありがとうございます