钥匙串 – 安全的数据存储

我正在开发一个应用程序与钥匙串实施。 我能够创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];