2016-06-16 8 views
0

Ich generierte einen privaten PKCS # 12 Schlüssel und legte es dann in PEM-Format, und schickte es an die iPhone App. Ich möchte diesen privaten Schlüssel im iPhone Keychain speichern.Setzen Sie RSA privaten Schlüssel in iPhone Schlüsselbund mit SecItemAdd

Zuerst entfernte ich die Header wie "BEGIN RSA PRIVATE KEY". Dann habe ich den Rest in NSData umgewandelt. Dann, mit Code wie folgt:

CFDictionaryRef issues in Swift

ich in der Lage war, ein SecKeyRef von diesem privaten Schlüssel zu erhalten.

Jetzt möchte ich wissen, wie ich diese SecKeyRef in den Schlüsselbund mit SecItemAdd einfügen kann?

+0

haben u versucht, jede Bibliothek zu benutzen? –

+0

Nein, welche Bibliothek würden Sie vorschlagen? – hockeybro

+0

mögen - https://github.com/kishikawakatsumi/KeychainAccess oder https://github.com/soffes/SSKeychain –

Antwort

0

Versuchen Sie, diese Methode zu verwenden SecKeyRef zu 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; 
} 

zu konvertieren, und fügen Sie dann zu Schlüsselanhängern.
Ich hoffe, dass dies Ihr Problem lösen wird.

Verwandte Themen