IOS 如果仅在设备上设置了设备代码,则无法创建私钥?
IOS not able to create privatekey if only devicecode is set on device?
我正在尝试生成一个私钥,只有在使用设备代码或当前的生物特征集(已在设备上注册)时才能访问该私钥。
当我在设备上注册了一个手指时它就可以工作,然后一切正常。但是如果我删除我注册的 "touchid-finger",并尝试生成一个新密钥,那么它 returns nil
错误代码为 -25293
代码示例:
func generateKey() -> SecKey?{
var error: Unmanaged<CFError>?
let accessControl = SecAccessControlCreateWithFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
[.devicePasscode,.or,.biometryCurrentSet],
nil)
let attributes:[String : Any] = [kSecAttrType as String: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits as String:4096,
kSecPrivateKeyAttrs as String: [
kSecAttrIsPermanent:true,
kSecAttrCanSign: true,
kSecAttrApplicationTag: "yes.its.my.tag",
kSecAttrAccessControl:accessControl!]]
let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error)
if(error != nil || privateKey == nil) {
fatalError("explode Kittens")
}
return privateKey
}
fyi.Its 实际上在模拟器上有效,但在真实设备上无效。
我是不是做错了什么?这是按预期工作吗?这是一个错误吗? (问题太多 :D )
我正在生成私钥,您需要在ACL 对象参数中添加kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly。这将允许您使用密码或生物特征数据获取私钥。
guard let aclObject = SecAccessControlCreateWithFlags(
kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
[.userPresence, .privateKeyUsage], nil) else {
return ""
}
// private key parameters
let privateKeyParams: [String: AnyObject] = [
kSecAttrAccessControl as String: aclObject as AnyObject, //protect with touch id
kSecAttrIsPermanent as String: true as AnyObject
]
// global parameters for our key generation
let parameters: [String: AnyObject] = [
kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
kSecAttrKeyType as String: kSecMessECCKeyType,
kSecAttrKeySizeInBits as String: kSecMessECCKeySize as AnyObject,
kSecAttrLabel as String: kSecMessECCSignLabel as AnyObject,
kSecPrivateKeyAttrs as String: privateKeyParams as AnyObject
]
guard let eCCPrivKey = SecKeyCreateRandomKey(parameters as CFDictionary, nil) else {
print("ECC KeyGen Error!")
return ""
}
guard let eCCPubKey = SecKeyCopyPublicKey(eCCPrivKey) else {
print("ECC Pub KeyGen Error")
return ""
}
“问题与项目的/创建/方式有关,而这不是这些标志控制的内容。
事实上,要使 .biometryCurrentSet 在使用时具有任何意义,在创建时实际上必须有一组当前的生物识别信息,我认为这就是 errSecAuthFailed 的来源。
如果没有可用的生物识别技术,我的建议是手动回退到仅使用 .devicePasscode。两种方法:A. 捕获错误并重试 B. 使用 LocalAuthentication 框架预检请求。"
Apple 说不行 :D
我正在尝试生成一个私钥,只有在使用设备代码或当前的生物特征集(已在设备上注册)时才能访问该私钥。
当我在设备上注册了一个手指时它就可以工作,然后一切正常。但是如果我删除我注册的 "touchid-finger",并尝试生成一个新密钥,那么它 returns nil
错误代码为 -25293
代码示例:
func generateKey() -> SecKey?{
var error: Unmanaged<CFError>?
let accessControl = SecAccessControlCreateWithFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
[.devicePasscode,.or,.biometryCurrentSet],
nil)
let attributes:[String : Any] = [kSecAttrType as String: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits as String:4096,
kSecPrivateKeyAttrs as String: [
kSecAttrIsPermanent:true,
kSecAttrCanSign: true,
kSecAttrApplicationTag: "yes.its.my.tag",
kSecAttrAccessControl:accessControl!]]
let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error)
if(error != nil || privateKey == nil) {
fatalError("explode Kittens")
}
return privateKey
}
fyi.Its 实际上在模拟器上有效,但在真实设备上无效。
我是不是做错了什么?这是按预期工作吗?这是一个错误吗? (问题太多 :D )
我正在生成私钥,您需要在ACL 对象参数中添加kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly。这将允许您使用密码或生物特征数据获取私钥。
guard let aclObject = SecAccessControlCreateWithFlags(
kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
[.userPresence, .privateKeyUsage], nil) else {
return ""
}
// private key parameters
let privateKeyParams: [String: AnyObject] = [
kSecAttrAccessControl as String: aclObject as AnyObject, //protect with touch id
kSecAttrIsPermanent as String: true as AnyObject
]
// global parameters for our key generation
let parameters: [String: AnyObject] = [
kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
kSecAttrKeyType as String: kSecMessECCKeyType,
kSecAttrKeySizeInBits as String: kSecMessECCKeySize as AnyObject,
kSecAttrLabel as String: kSecMessECCSignLabel as AnyObject,
kSecPrivateKeyAttrs as String: privateKeyParams as AnyObject
]
guard let eCCPrivKey = SecKeyCreateRandomKey(parameters as CFDictionary, nil) else {
print("ECC KeyGen Error!")
return ""
}
guard let eCCPubKey = SecKeyCopyPublicKey(eCCPrivKey) else {
print("ECC Pub KeyGen Error")
return ""
}
“问题与项目的/创建/方式有关,而这不是这些标志控制的内容。
事实上,要使 .biometryCurrentSet 在使用时具有任何意义,在创建时实际上必须有一组当前的生物识别信息,我认为这就是 errSecAuthFailed 的来源。
如果没有可用的生物识别技术,我的建议是手动回退到仅使用 .devicePasscode。两种方法:A. 捕获错误并重试 B. 使用 LocalAuthentication 框架预检请求。"
Apple 说不行 :D