我生成了一个私有 PKCS#12 密钥,然后将其以 PEM 格式发送,并将其发送到 iPhone 应用程序。我想将此私钥保存在 iPhone 钥匙串中。
首先,我删除了“BEGIN RSA PRIVATE KEY”之类的标题。然后我将其余部分转换为NSData
. 然后,使用这样的代码:
我能够SecKeyRef
从这个私钥中得到一个。
现在我想知道如何SecKeyRef
使用SecItemAdd
?
我生成了一个私有 PKCS#12 密钥,然后将其以 PEM 格式发送,并将其发送到 iPhone 应用程序。我想将此私钥保存在 iPhone 钥匙串中。
首先,我删除了“BEGIN RSA PRIVATE KEY”之类的标题。然后我将其余部分转换为NSData
. 然后,使用这样的代码:
我能够SecKeyRef
从这个私钥中得到一个。
现在我想知道如何SecKeyRef
使用SecItemAdd
?
尝试使用此方法转换SecKeyRef
为NSData
- (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey {
static const uint8_t publicKeyIdentifier[] = "com.your.company.publickey";
NSData *publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];
OSStatus sanityCheck = noErr;
NSData * publicKeyBits = nil;
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
[queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
[queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
// Temporarily add key to the Keychain, return as data:
NSMutableDictionary * attributes = [queryPublicKey mutableCopy];
[attributes setObject:(__bridge id)givenKey forKey:(__bridge id)kSecValueRef];
[attributes setObject:@YES forKey:(__bridge id)kSecReturnData];
CFTypeRef result;
sanityCheck = SecItemAdd((__bridge CFDictionaryRef) attributes, &result);
if (sanityCheck == errSecSuccess) {
publicKeyBits = CFBridgingRelease(result);
// Remove from Keychain again:
(void)SecItemDelete((__bridge CFDictionaryRef) queryPublicKey);
}
return publicKeyBits;
}
然后将其添加到钥匙串。
我希望这能解决你的问题。
这对我有用:
这两个库可以提供帮助: Swift:https ://github.com/btnguyen2k/swift-rsautils Obj-C:https ://github.com/ideawu/Objective-C-RSA