SecKeyCreateSignature 使用私钥进行错误访问
SecKeyCreateSignature give Bad Access with privateKey
我在尝试使用 xcode SecKeyCreateSignature 创建签名时收到 Bad Access。
这与网络视图中的生物识别注册有关。当用户点击注册页面时,设备会向网络视图发送设备 ID 和 public 密钥。
要生成我有的密钥...
private let tag = "com.CustomTagName.private",
deviceId = UIDevice.current.identifierForVendor!.uuidString,
privateKeyAttr: [NSObject: NSObject] = [
kSecAttrIsPermanent:true as NSObject,
kSecAttrApplicationTag: "com.CustomTagName.private".data(using: .utf8)! as NSObject,
kSecClass: kSecClassKey,
kSecAttrType: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits : 2048 as NSObject,
kSecReturnData: kCFBooleanTrue
],
privateKey : SecKey?,
privateKeyStr = ""
;
...
private func generateKeys() throws {
var err: Unmanaged<CFError>?
do {
guard let prk = SecKeyCreateRandomKey(privateKeyAttr as CFDictionary, &err) else {
throw err!.takeRetainedValue() as Error
}
// After creating a random private key It appears we have to unwrap it...?
guard let unWrappedKey = SecKeyCopyExternalRepresentation(prk, &err) as Data? else {
throw err!.takeRetainedValue() as Error
}
self.privateKeyStr = unWrappedKey.base64EncodedString()
self.privateKey = prk;
} catch {
}
}
我从这里开始使用
let publicKey = SecKeyCopyPublicKey(self.privateKey!);
如果我要调用 SecKeyCreateSignature,我没有问题。但是在用户需要登录之前我不会调用签名。所以我使用...
检索密钥
let message = "HereIAm";
let statusPrivateKey = SecItemCopyMatching(privateKeyAttr as CFDictionary, &resultPrivateKey)
if statusPrivateKey != noErr || resultPrivateKey == nil{
fatalError("Error getting private key")
}
self.privateKey = resultPrivateKey as! SecKey?;
self.privateKeyStr = (privateKey as! Data).base64EncodedString()
// Bad Access Error Here \
guard let signFingerPrint = SecKeyCreateSignature(privateKey!, SecKeyAlgorithm.rsaSignatureMessagePKCS1v15SHA512, message.data(using: .utf8)! as CFData, &err) else {
fatalError("Signing error")
}
我注意到 SecKey 不需要用 SecKeyCopyExternalRepresentation 解包。
当数据相同时,我不明白 to Sec Keys 的区别。
如何检索我可以创建签名的私钥?
我找到了答案...有点,在我的 privateAttrs 中我有
kSecReturnData: kCFBooleanTrue
应该是
kSecReturnRef: kCFBooleanTrue
我的情况是 returning Data 作为类型,但我需要 return 原始引用的类型。
我在尝试使用 xcode SecKeyCreateSignature 创建签名时收到 Bad Access。
这与网络视图中的生物识别注册有关。当用户点击注册页面时,设备会向网络视图发送设备 ID 和 public 密钥。
要生成我有的密钥...
private let tag = "com.CustomTagName.private",
deviceId = UIDevice.current.identifierForVendor!.uuidString,
privateKeyAttr: [NSObject: NSObject] = [
kSecAttrIsPermanent:true as NSObject,
kSecAttrApplicationTag: "com.CustomTagName.private".data(using: .utf8)! as NSObject,
kSecClass: kSecClassKey,
kSecAttrType: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits : 2048 as NSObject,
kSecReturnData: kCFBooleanTrue
],
privateKey : SecKey?,
privateKeyStr = ""
;
...
private func generateKeys() throws {
var err: Unmanaged<CFError>?
do {
guard let prk = SecKeyCreateRandomKey(privateKeyAttr as CFDictionary, &err) else {
throw err!.takeRetainedValue() as Error
}
// After creating a random private key It appears we have to unwrap it...?
guard let unWrappedKey = SecKeyCopyExternalRepresentation(prk, &err) as Data? else {
throw err!.takeRetainedValue() as Error
}
self.privateKeyStr = unWrappedKey.base64EncodedString()
self.privateKey = prk;
} catch {
}
}
我从这里开始使用
let publicKey = SecKeyCopyPublicKey(self.privateKey!);
如果我要调用 SecKeyCreateSignature,我没有问题。但是在用户需要登录之前我不会调用签名。所以我使用...
检索密钥let message = "HereIAm";
let statusPrivateKey = SecItemCopyMatching(privateKeyAttr as CFDictionary, &resultPrivateKey)
if statusPrivateKey != noErr || resultPrivateKey == nil{
fatalError("Error getting private key")
}
self.privateKey = resultPrivateKey as! SecKey?;
self.privateKeyStr = (privateKey as! Data).base64EncodedString()
// Bad Access Error Here \
guard let signFingerPrint = SecKeyCreateSignature(privateKey!, SecKeyAlgorithm.rsaSignatureMessagePKCS1v15SHA512, message.data(using: .utf8)! as CFData, &err) else {
fatalError("Signing error")
}
我注意到 SecKey 不需要用 SecKeyCopyExternalRepresentation 解包。
当数据相同时,我不明白 to Sec Keys 的区别。
如何检索我可以创建签名的私钥?
我找到了答案...有点,在我的 privateAttrs 中我有
kSecReturnData: kCFBooleanTrue
应该是
kSecReturnRef: kCFBooleanTrue
我的情况是 returning Data 作为类型,但我需要 return 原始引用的类型。