Keychain和Secure Enclave有什么区别

时间:2016-12-08 12:21:35

标签: ios objective-c xcode security keychain

我一直在搜索钥匙串存放安全区或其他任何区域的地方,我发现很多文章(其中一条stackoverflow answer)表示关注,但我正在寻找一些像Apple这样的认证声明

  

钥匙串存储加密的密钥(和其他小数据),并限制对该数据的访问。此外,在最近的iPhone(5S及更高版本)中,钥匙串位于单独的处理器中,Secure Enclave还限制了访问。没有更安全的方法来在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;
    }
    

寻找经过验证的答案。干杯

3 个答案:

答案 0 :(得分:4)

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

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

允许访问私钥Keychain Access应用程序。

答案 1 :(得分:2)

并非所有钥匙串物品都存放在安全的飞地中 From Apple document

  

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

答案 2 :(得分:0)

看看苹果的iOS Security documentation,它描述了Secure Enclave和Keychain到底是什么。

Secure Enclave 是在片上系统(SoC)内制造的协处理器。它使用加密的内存,并包含一个硬件随机数生成器。至于钥匙串 iOS钥匙串可提供安全的 存储这些(密码和其他短但敏感的数据位)项目的方式。 [...]钥匙串是作为存储在文件上的SQLite数据库实现的 系统。

钥匙串是一种在SQLite数据库中存储加密数据(例如密码)的软件。对该数据进行加密的密钥位于Secure Enclave内部-绝不会离开SE,如本段所述

  

使用两个不同的AES-256-GCM密钥(一个   表密钥(元数据)和每行密钥(秘密密钥)。钥匙串元数据   (除kSecValue之外的所有其他属性)已使用元数据密钥加密   在加密秘密值(kSecValueData)时加快搜索速度   用密钥。元数据密钥受Secure Enclave保护   处理器,但缓存在应用程序处理器中以允许快速查询   钥匙圈密钥始终需要往返于   安全的Enclave处理器。

要回答您的问题:否,钥匙串项目存储在Secure Enclave中,不,它们存储在磁盘上的SQLite数据库中,但是解密此数据所需的加密密钥在Secure Enclave内部。至于kSecAttrTokenIDSecureEnclave,它被认为是一个标志,指示密钥应位于安全元素内的generated