iOS硬件支持的密钥证明

时间:2017-10-24 15:14:51

标签: ios pki

在android中,有一种方法可以知道密钥对中的公钥是否是在TEE中生成的,因此是硬件支持的(https://source.android.com/security/keystore/attestation)。我找不到在iOS中这样做的方法。有没有人知道是否有办法?

3 个答案:

答案 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的字节。它总是会失败..因此,您总是可以尝试获取密钥,然后调用该函数,看看它是否失败。