我正在尝试使用 SecKeyGeneratePair,并将属性设置为 kSecAttrTokenIDSecureEnclave 并将其留空。根据https://developer.apple.com/reference/security/ksecattrtokenid如果未设置 kSecAttrTokenID,则该项目应存储在普通钥匙串数据库中。但是,无论我是否设置它,keychain-2.db 文件大小都不会改变。但是,我可以将 SecKeyRawSign() 与生成的私钥一起使用,而不会出现任何错误。那么私钥存储在哪里呢?
问问题
573 次
1 回答
0
如果您设置了 kSecAttrTokenIDSecureEnclave,那么真正的私钥存储在安全 enclave 中的某个位置,而返回给您的私钥只是引用了安全 enclave 中的真正私钥。但是,就使用密钥而言,它没有任何区别。您以完全相同的方式使用收到的 SecKey。
如果您想在应用程序的连续运行中使用相同的密钥对,就像您最可能想要的那样,您必须将您收到的私钥存储在密钥链中,并在应用程序再次启动时从密钥链中检索它,无论您使用这个令牌与否。如果你不这样做,那么你就没有 SecKey,所以私钥仍然在安全飞地中,但是你失去了任何访问它的方法。
可以这样看:通常,SecKey 是一个盒子,里面装有门钥匙或车钥匙。但是使用 kSecAttrTokenIDSecureEnclave,SecKey 是一个盒子,里面有一张纸,它告诉真正的密钥在安全飞地中的位置。iOS 足够聪明,可以同时处理这两种盒子。但是,您需要自己将每种盒子存储在钥匙串中。如果你不照顾这个盒子,当你的应用重新启动时它就会消失。
于 2017-08-13T15:03:05.973 回答