Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 钥匙链-安全数据存储_Ios_Objective C_Xcode_Keychain - Fatal编程技术网

Ios 钥匙链-安全数据存储

Ios 钥匙链-安全数据存储,ios,objective-c,xcode,keychain,Ios,Objective C,Xcode,Keychain,我正在开发一个带有keychain实现的应用程序。我能够创建和保存数据到钥匙链。我使用的是苹果提供的 根据要求,我必须在钥匙链中实现尽可能好的安全性(安全团队指出了一些缺陷,例如在越狱设备上的可访问性) 有人能告诉我方向吗?很久以前,我还在应用程序中使用您引用的同一个包装器实现了keychain,但当然有很多修改 基本上,钥匙链是相当安全的。根据苹果公司的说法,它是一个加密的容器,保存多个应用程序的安全信息,这意味着当钥匙链被锁定时,没有人可以访问其受保护的内容 在iOS中,只有创建钥匙链的应用

我正在开发一个带有keychain实现的应用程序。我能够创建和保存数据到钥匙链。我使用的是苹果提供的

根据要求,我必须在钥匙链中实现尽可能好的安全性(安全团队指出了一些缺陷,例如在越狱设备上的可访问性)


有人能告诉我方向吗?

很久以前,我还在应用程序中使用您引用的同一个包装器实现了keychain,但当然有很多修改

基本上,钥匙链是相当安全的。根据苹果公司的说法,它是一个加密的容器,保存多个应用程序的安全信息,这意味着当钥匙链被锁定时,没有人可以访问其受保护的内容

在iOS中,只有创建钥匙链的应用程序才能访问它。 根据苹果的文档,iOS可以选择内存缓存或磁盘缓存

但在iOS 4.xx++中,它只是缓存了磁盘(不知道为什么),因此总是创建一个 sqlite DB,其中密钥链中的所有数据都存储在对应于特定标识符的位置

Sqlite DB可以被黑客攻击到根设备或被判入狱的设备上

要固定钥匙链

1在添加或
在方法“
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在添加到密钥链之前加密数据。我使用AES-128加密。 还要确保用于加密的密钥是RSA密钥(由SSL Web服务发送)

注意:-钥匙链数据存储在iPhone上的
/private/var/Keychains/Keychain-2.db
文件中


希望对您有所帮助。

非常感谢。这解释了我在尝试设置ksecattraccessibleewhenunlockedthisdeviceonly forKey:(id)kSecAttrAccessible作为密钥链包装中的“setObject”时遇到的错误。
    [attributeDict setObject:(__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible];