ios Keychain和Secure Enclave有什么区别

bis0qfac  于 12个月前  发布在  iOS
关注(0)|答案(4)|浏览(158)

我一直在寻找钥匙串商店无论是安全飞地或任何其他,我发现了许多文章(这stackoverflow answer之一)说以下,但我正在寻找一些像苹果声明认证
密钥链存储加密的密钥(和其他小数据),并限制对该数据的访问。此外,在最近的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;
}

寻找经过验证的答案。欢呼

iswrvxsc

iswrvxsc1#

并非所有的钥匙串项目都存储在安全区域中
From Apple document
Secure Enclave支持的唯一密钥链项是256位椭圆曲线私钥(密钥类型为kSecAttrKeyTypeEC的密钥)。此类密钥必须使用SecKeyGeneratePair(:_:)函数直接在Secure Enclave上生成,并在参数字典中将kSecAttrTokenID密钥设置为kSecAttrTokenIDSecureEnclave。无法将预先存在的密钥导入安全区域。

2w3rbyxf

2w3rbyxf2#

看看苹果的iOS security whitepaper,它描述了什么是安全飞地和钥匙链。

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

Keychain是一个软件,它将加密数据(如密码)存储在SQLite数据库中。加密此数据的密钥位于Secure Enclave内-根据本段,它永远不会离开SE
密钥链项使用两个不同的AES-256-GCM密钥进行加密,即表密钥(元数据)和每行密钥(秘密密钥)。密钥链元数据(除kSecValue之外的所有属性)使用元数据密钥加密以加速搜索,而秘密值(kSecValueData)使用秘密密钥加密。元数据密钥由Secure Enclave处理器保护,但缓存在应用程序处理器中,以允许快速查询密钥链。密钥始终需要通过Secure Enclave处理器进行往返。
回答您的问题:是存储在Secure Enclave中的密钥链项,不,它们存储在磁盘上的SQLite数据库中,但解密此数据所需的加密密钥在Secure Enclave中。至于kSecAttrTokenIDSecureEnclave,它似乎是一个标志,指示密钥应该在安全元素内生成。

1aaf6o9v

1aaf6o9v3#

钥匙串使用安全飞地,安全飞地是在硬件中实现的。
据我所知:
默认情况下,非对称密钥对被创建并存储在安全区域中。私钥仅在创建时可用,以后无法获得。使用私钥的非对称操作从密钥链中获取私钥,而不将其公开给用户代码。
有一个例外,允许访问私钥,钥匙链访问应用程序。

xytpbqjk

xytpbqjk4#

钥匙扣物品是否存放在安全的飞地中
不,它们不是,安全飞地只支持256位的椭圆曲线密钥。Secure Enclave是一个基于硬件的密钥管理器,与主处理器隔离,提供额外的安全层。当您使用Secure Enclave保护私钥时,您永远不会处理纯文本密钥,因此密钥很难被泄露。相反,您指示Secure Enclave创建和编码密钥,然后对其进行解码和执行操作。您只接收这些操作的输出,例如加密数据或加密签名验证结果。
为什么我们在创建密钥对时使用此kSecAttrTokenIDSecureEnclave。(下面的代码示例)。
指示生成操作应在安全区域内进行。如果您不想在Secure Enclave中创建密钥对,则无需传递该属性。

相关问题