钥匙串 – 安全的数据存储
我正在开发一个应用程序与钥匙串实施。 我能够创build&保存数据到钥匙串。 我正在使用Apple提供的Keychain Wrapper类 。
根据要求,我必须在KeyChain中实现最好的安全性(安全小组指出失败,例如在监狱设备上的可访问性)。
有人能给我指导吗?
我也已经在应用程序中实现了keychain很长的时间使用你引用的相同包装,但是,当然有很多修改。
基本上钥匙串是相当安全的。根据苹果,它是一个encryption容器,为多个应用程序保存安全的信息,这意味着当钥匙串被locking,没有人可以访问其保护的内容。
在iOS中,只有创build钥匙串的应用程序才能访问它。 根据苹果的文档,iOS可以select内存caching或磁盘caching。
但是,从iOS 4.xx ++,它只是磁盘caching(不知道为什么),因此总是创build一个sqlite数据库,其中钥匙串中的所有数据存储对应于一个特定的标识符。
Sqlite数据库可以在根或破解设备上被黑客入侵。
保护钥匙链
1在添加或时添加安全关键字“ kSecAttrAccessibleWhenUnlockedThisDeviceOnly
”
更新方法“ SecItemUpdate
”和“ SecItemAdd
”上的钥匙串中的数据。
就像是 :-
- (void)writeToKeychain { NSDictionary *attributes = NULL; NSMutableDictionary *updateItem = NULL; OSStatus result; if (SecItemCopyMatching((CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes) == noErr) { updateItem = [NSMutableDictionary dictionaryWithDictionary:attributes]; [updateItem setObject:[genericPasswordQuery objectForKey:(id)kSecClass] forKey:(id)kSecClass]; NSMutableDictionary *tempCheck = [self dictionaryToSecItemFormat:keychainItemData]; [tempCheck removeObjectForKey:(id)kSecClass]; #if TARGET_IPHONE_SIMULATOR [tempCheck removeObjectForKey:(id)kSecAttrAccessGroup]; #endif [updateItem setObject:(id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(id)kSecAttrAccessible]; result = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck); NSAssert( result == noErr, @"Couldn't update the Keychain Item." ); CFRelease(attributes); } else { [keychainItemData setObject:(id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(id)kSecAttrAccessible]; result = SecItemAdd((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainItemData], NULL); NSAssert( result == noErr, @"Couldn't add the Keychain Item." ); } }
2在添加到密钥链之前对数据进行encryption。我使用了AES-128encryption。 还要确保用于encryption的密钥是RSA密钥(由SSL Web服务发送)。
注:钥匙串数据存储在iPhone的/private/var/Keychains/keychain-2.db
文件中。
希望它可以帮助你。
[attributeDict setObject:(__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible];