生成无法导出的私钥
Generate private key that cannot be exported
我想在 iPhone 上生成一个密钥对,这样私钥 只能 用于在特定 iPhone 上签署数据块=].
SecKeyGeneratePair
函数看起来很有前途。我可以为钥匙串生成一个密钥对(使用 kSecAttrIsPermanent
),我可以使用私钥禁用解密、派生和解包(设置 kSecAttrCanDecrypt
、kSecAttrCanDerive
和 kSecAttrCanUnwrap
false
).
关于使用 SecKeyGeneratePair
生成的密钥对,有两件事让我担心:
是否可以将钥匙串外的私钥导出到应用程序内存中?
是否可以在创建私钥后更改密钥属性(例如将kSecAttrCanDecrypt
设置为true
)?
回答第一个问题,根据this source无法找回私钥:
One API call, SecKeyGeneratePair(), creates a public and private key.
The public key is returned to the app, and the private key is sent
directly to the Secure Enclave. This private key cannot be retrieved.
有更多信息可用here:
The supported keys are Elliptic Curve P256, the private key is not
extractible in any form, even protected, and the applications are
RawSign and RawVerify.
This article 提供了更多详细信息(与此线程中的其他答案相比):
SecGenerateKeyPair(), which is used to generate RSA and ECDSA key pairs, can now be configured to directly store the generated private key in the device’s Keychain (within the Secure Enclave). This means that the private key can be used without ever leaving the device’s Secure Enclave.
还有重要补充:
生成密钥对时需要使用kSecAttrTokenIDSecureEnclave
属性。
如果您不指定此属性,即使在 iOS9 上也可以访问私钥。
我想在 iPhone 上生成一个密钥对,这样私钥 只能 用于在特定 iPhone 上签署数据块=].
SecKeyGeneratePair
函数看起来很有前途。我可以为钥匙串生成一个密钥对(使用 kSecAttrIsPermanent
),我可以使用私钥禁用解密、派生和解包(设置 kSecAttrCanDecrypt
、kSecAttrCanDerive
和 kSecAttrCanUnwrap
false
).
关于使用 SecKeyGeneratePair
生成的密钥对,有两件事让我担心:
是否可以将钥匙串外的私钥导出到应用程序内存中?
是否可以在创建私钥后更改密钥属性(例如将
kSecAttrCanDecrypt
设置为true
)?
回答第一个问题,根据this source无法找回私钥:
One API call, SecKeyGeneratePair(), creates a public and private key. The public key is returned to the app, and the private key is sent directly to the Secure Enclave. This private key cannot be retrieved.
有更多信息可用here:
The supported keys are Elliptic Curve P256, the private key is not extractible in any form, even protected, and the applications are RawSign and RawVerify.
This article 提供了更多详细信息(与此线程中的其他答案相比):
SecGenerateKeyPair(), which is used to generate RSA and ECDSA key pairs, can now be configured to directly store the generated private key in the device’s Keychain (within the Secure Enclave). This means that the private key can be used without ever leaving the device’s Secure Enclave.
还有重要补充:
生成密钥对时需要使用kSecAttrTokenIDSecureEnclave
属性。
如果您不指定此属性,即使在 iOS9 上也可以访问私钥。