在android中,有一种方法可以知道密钥对中的公钥是否是在TEE中生成的,因此是硬件支持的(https://source.android.com/security/keystore/attestation)。我找不到在iOS中这样做的方法。有没有人知道是否有办法?
答案 0 :(得分:0)
我不知道直接类似的可能性,但如果您的应用程序位于非越狱设备上,您可以create keys并将其存储在iOS设备的Secure Enclave中,并确保它们已存储安全,不能妥协。请注意,您只能存储256位椭圆曲线私钥。然后,您可以从密钥获取公钥,例如SecKeyCopyPublicKey
。
TrailOfBits创建了一个example project,您可以在其中查找与Secure Enclave API的更多交互。
Secure Enclave本身受到安全启动链的保护,以确保其单独的软件经过Apple验证和签名。 请参阅:https://www.apple.com/business/docs/iOS_Security_Guide.pdf
答案 1 :(得分:0)
iOS 14以DCAppAttestService
的形式提供类似服务
https://developer.apple.com/documentation/devicecheck/dcappattestservice
答案 2 :(得分:0)
拔键时,检查kSecAttrTokenID
是否设置为kSecAttrTokenIDSecureEnclave
这将告诉您密钥是否来自secureEnclave
(硅/硬件)。
示例键:
let attributes: [CFString: Any] = [
kSecClass: kSecClassKey,
kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,
kSecAttrKeySizeInBits: 256,
kSecAttrCreator: "com.myapp.crypto",
kSecAttrTokenID: kSecAttrTokenIDSecureEnclave,
kSecPrivateKeyAttrs: [
kSecAttrIsPermanent: true,
kSecAttrApplicationTag: "my_key_id",
kSecAttrAccessControl: SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, [.privateKeyUsage], nil)
]
]
var error: Unmanaged<CFError>?
let key = SecKeyCreateRandomKey(attributes as CFDictionary, &error)
检索密钥时,使用kSecReturnAttributes: kCFBooleanTrue
获取密钥的属性:
let query: [CFString: Any] = [
kSecClass: kSecClassKey,
kSecAttrApplicationTag: "my_key_id",
kSecMatchLimit: kSecMatchLimitOne,
kSecReturnRef: kCFBooleanFalse,
kSecReturnAttributes: kCFBooleanTrue
]
var result: CFTypeRef?
let error = SecItemCopyMatching(query as CFDictionary, &result)
然后检查kSecAttrTokenID: kSecAttrTokenIDSecureEnclave
是否存在。.
一种更简单的方法..当密钥存储在kSecAttrTokenIDSecureEnclave
中时,您将无法将其转换为SecKeyCopyExternalRepresentation
的字节。它总是会失败..因此,您总是可以尝试获取密钥,然后调用该函数,看看它是否失败。