Ale*_*eem 8 security xcode objective-c keychain ios
我一直在搜索钥匙串存储安全飞地或其他任何地方的位置,我发现了很多文章(this stackoverflow answer之一),其中说明如下,但我正在寻找一些经过身份验证的 Apple 声明
钥匙串存储加密的密钥(和其他小数据)并限制对该数据的访问。此外,在最近的 iPhone(5S 及更高版本)中,钥匙串位于一个单独的处理器中,即安全隔区,它额外限制了访问。在 iOS 中没有更安全的方法来存储密钥。
所以我的查询基于上述声明。
CFTypeRef存储在哪里为什么我们kSecAttrTokenIDSecureEnclave在创建密钥对时使用它。(以下代码示例)。
-(bool) generateKeyPairWithAccessControlObject:(SecAccessControlRef)accessControlRef
{
CFMutableDictionaryRef accessControlDict = newCFDict;;
CFDictionaryAddValue(accessControlDict, kSecAttrAccessControl, accessControlRef);
CFDictionaryAddValue(accessControlDict, kSecAttrIsPermanent, kCFBooleanTrue);
CFDictionaryAddValue(accessControlDict, kSecAttrLabel, kPrivateKeyName);
// create dict which actually saves key into keychain
CFMutableDictionaryRef generatePairRef = newCFDict;
CFDictionaryAddValue(generatePairRef, kSecAttrTokenID, kSecAttrTokenIDSecureEnclave);
CFDictionaryAddValue(generatePairRef, kSecAttrKeyType, kSecAttrKeyTypeEC);
CFDictionaryAddValue(generatePairRef, kSecAttrKeySizeInBits, (__bridge const void *)([NSNumber numberWithInt:256]));
CFDictionaryAddValue(generatePairRef, kSecPrivateKeyAttrs, accessControlDict);
OSStatus status = SecKeyGeneratePair(generatePairRef, &publicKeyRef, &privateKeyRef);
if (status != errSecSuccess)
return NO;
[self savePublicKeyFromRef:publicKeyRef];
return YES;
}
Run Code Online (Sandbox Code Playgroud)寻找经过验证的答案。干杯
小智 7
看看 Apple 的iOS 安全文档,它描述了 Secure Enclave 和 Keychain 的确切含义。
甲安全区域是芯片(SoC)系统中制造的协处理器。它使用加密内存并包括一个硬件随机数生成器。至于Keychain,iOS Keychain 提供了一种安全的方式来存储这些(密码和其他简短但敏感的数据位)项目。[...] Keychain 被实现为存储在文件系统上的 SQLite 数据库。.
钥匙串是一种将加密数据(例如密码)存储在 SQLite 数据库中的软件。加密此数据的密钥位于 Secure Enclave 内 - 根据本段,它永远不会离开 SE
钥匙串项目使用两个不同的 AES-256-GCM 密钥加密,一个表密钥(元数据)和每行密钥(秘密密钥)。钥匙串元数据(除 kSecValue 之外的所有属性)使用元数据密钥加密以加快搜索速度,而秘密值 (kSecValueData) 使用密钥加密。元数据密钥由 Secure Enclave 处理器保护,但缓存在应用处理器中以允许快速查询钥匙串。密钥始终需要通过 Secure Enclave 处理器进行往返。
回答您的问题:钥匙串项目是否存储在 Secure Enclave 中,不,它们存储在磁盘上的 SQLite 数据库中,但解密此数据所需的加密密钥位于 Secure Enclave 中。至于kSecAttrTokenIDSecureEnclave那个似乎是一个标志,表明密钥应该在安全元件内部生成。
Keychain使用Secure Enclave,Secure Enclave是在硬件中实现的。
据我了解:
默认情况下,非对称密钥对被创建并存储在安全飞地中。私钥仅在创建时可用,以后无法获取。使用私钥的非对称操作从钥匙串中获取私钥,而不将其暴露给用户代码。
有一个例外允许访问私钥,即钥匙串访问应用程序。
并非所有钥匙串项目都存储在安全的飞地中
来自 Apple 文档
在通过安全区域只支持钥匙串项是256位的椭圆曲线私钥(那些具有密钥类型kSecAttrKeyTypeEC)。此类密钥必须使用 SecKeyGeneratePair( : :_:) 函数直接在 Secure Enclave 上生成,并将 kSecAttrTokenID 密钥设置为参数字典中的 kSecAttrTokenIDSecureEnclave。无法将预先存在的密钥导入 Secure Enclave。