我正在尝试使用SecKeyGeneratePair,我已将该属性设置为kSecAttrTokenIDSecureEnclave并将其留空。根据{{3}},如果未设置kSecAttrTokenID,则该项应存储在普通的keychain DB中。但是,无论我是否设置它,keychain-2.db文件大小都不会更改。然而,我能够使用生成的私钥使用SecKeyRawSign()而没有任何错误。那么私钥存储在哪里?
答案 0 :(得分:0)
如果设置了kSecAttrTokenIDSecureEnclave,那么真正的私钥将存储在安全区域的某个位置,而返回给您的私钥只是引用安全区域中的真实私钥。但是,就使用密钥而言,它并没有任何区别。您以完全相同的方式使用收到的SecKey。
如果您想要在应用程序的连续运行中使用相同的密钥对,就像您最想要的那样,您必须存储您在密钥链中收到的私钥,并在应用程序再次启动时从密钥链中检索它,无论是你是否使用这个令牌。如果你没有,那么你没有SecKey,所以私钥仍以某种方式存在于安全区域,但你失去了访问它的任何方式。
这样看:通常,SecKey是一个带有门钥匙或车钥匙的盒子。但是使用kSecAttrTokenIDSecureEnclave,SecKey是一个盒子,里面有一张纸,告诉真正的钥匙在安全区域的位置。 iOS非常聪明,可以完全相同地处理这两种盒子。但是,您需要自己将各种盒子存放在钥匙串中。如果您没有照顾好这个盒子,那么当您的应用重新启动时它就消失了。