钥匙串和安全飞地有什么区别

Ale*_*eem 8 security xcode objective-c keychain ios

我一直在搜索钥匙串存储安全飞地或其他任何地方的位置,我发现了很多文章(this stackoverflow answer之一),其中说明如下,但我正在寻找一些经过身份验证的 Apple 声明

钥匙串存储加密的密钥(和其他小数据)并限制对该数据的访问。此外,在最近的 iPhone(5S 及更高版本)中,钥匙串位于一个单独的处理器中,即安全隔区,它额外限制了访问。在 iOS 中没有更安全的方法来存储密钥。

所以我的查询基于上述声明。

  • Keychain Items 是否存储在安全的 Enclave 中
  • 如果是,那么公钥和私钥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)系统中制造的协处理器。它使用加密内存并包括一个硬件随机数生成器。至于KeychainiOS Keychain 提供了一种安全的方式来存储这些(密码和其他简短但敏感的数据位)项目。[...] Keychain 被实现为存储在文件系统上的 SQLite 数据库。.

钥匙串是一种将加密数据(例如密码)存储在 SQLite 数据库中的软件。加密此数据的密钥位于 Secure Enclave 内 - 根据本段,它永远不会离开 SE

钥匙串项目使用两个不同的 AES-256-GCM 密钥加密,一个表密钥(元数据)和每行密钥(秘密密钥)。钥匙串元数据(除 kSecValue 之外的所有属性)使用元数据密钥加密以加快搜索速度,而秘密值 (kSecValueData) 使用密钥加密。元数据密钥由 Secure Enclave 处理器保护,但缓存在应用处理器中以允许快速查询钥匙串。密钥始终需要通过 Secure Enclave 处理器进行往返。

回答您的问题:钥匙串项目是否存储在 Secure Enclave 中,不,它们存储在磁盘上的 SQLite 数据库中,但解密此数据所需的加密密钥位于 Secure Enclave 中。至于kSecAttrTokenIDSecureEnclave那个似乎是一个标志,表明密钥应该在安全元件内部生成


zap*_*aph 5

Keychain使用Secure Enclave,Secure Enclave是在硬件中实现的。

据我了解:
默认情况下,非对称密钥对被创建并存储在安全飞地中。私钥仅在创建时可用,以后无法获取。使用私钥的非对称操作从钥匙串中获取私钥,而不将其暴露给用户代码。

有一个例外允许访问私钥,即钥匙串访问应用程序。


Hai*_* Hw 5

并非所有钥匙串项目都存储在安全的飞地中
来自 Apple 文档

通过安全区域只支持钥匙串项是256位的椭圆曲线私钥(那些具有密钥类型kSecAttrKeyTypeEC)。此类密钥必须使用 SecKeyGeneratePair( : :_:) 函数直接在 Secure Enclave 上生成,并将 kSecAttrTokenID 密钥设置为参数字典中的 kSecAttrTokenIDSecureEnclave。无法将预先存在的密钥导入 Secure Enclave。