Как проверить, хранится ли Key в KeyChain в Swift - PullRequest
1 голос
/ 29 мая 2019

Я пытался сохранить два ключа, приватный и открытый, в KeyChain, и когда я пытаюсь это сделать, мой результат возвращает 0, что, как я полагаю, означает, что это было хранилище, но когда я пытаюсь вернуться, чтобы расшифровать сообщение, явернуть его как ноль, так что если есть способ проверить, были ли ключи основаны на хранилище SecItemCopyMatching?но я не получаю никаких ошибок при их создании

let tagName = "PrivateKeyTag"
let privkey = "key"
        let privkeyData = Data(privkey!.utf8)
        let privateFilter: [String : Any] = [
            (kSecClass as String)              : kSecClassKey,
            (kSecAttrKeyType as String)        : kSecAttrKeyTypeRSA,
            (kSecAttrApplicationTag as String) : tagName,
            (kSecValueData as String)          : privkeyData,
            (kSecAttrKeyClass as String)       : kSecAttrKeyClassPrivate,
           // kSecAttrKeySizeInBits as String: 2048,
            (kSecReturnPersistentRef as String): true,

            ] as [String : Any]
        let result = SecItemAdd(privateFilter as CFDictionary, nil)
        if ((result != noErr) && (result != errSecDuplicateItem)) {
            NSLog("Cannot add key to keychain, status \(result).")
        }

let getquery: [String: Any] = [kSecClass as String: kSecClassKey,
                                       kSecAttrApplicationTag as String: tag,
                                       kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
                                       ]
        var item: CFTypeRef?
        let status = SecItemCopyMatching(getquery as CFDictionary, &item)
        guard status == errSecSuccess else {
            print("key not found")
            return
        }
        let key = item as! SecKey

1 Ответ

0 голосов
/ 29 мая 2019

Когда вы создаете криптографический ключ, вы можете установить для параметра kSecAttrIsPermanent значение true, которое автоматически сохранит ключ в цепочке для ключей по умолчанию. Это немного очистит ваш код, так что вам больше не придется иметь дело с SecItemAdd () и всей обработкой ошибок с этим. Вот простой способ сделать то, что вы пытаетесь сделать.

Чтобы создать ключ и запросить ключ

let tag = "com.example.keys.mykey".data(using: .utf8)!
let attributes: [String: Any] =
    [kSecAttrKeyType as String:            kSecAttrKeyTypeRSA,
     kSecAttrKeySizeInBits as String:      2048,
     kSecPrivateKeyAttrs as String:
        [kSecAttrIsPermanent as String:    true,
         kSecAttrApplicationTag as String: tag]
]

let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, nil) 
let query: [String: Any] = [kSecClass as String: kSecClassKey,
                            kSecAttrApplicationTag as String: tag,
                            kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
                            kSecReturnRef as String: true]
var item: CFTypeRef?
let status2 = SecItemCopyMatching(query as CFDictionary, &item)
guard status2 == errSecSuccess else { print("error1"); return }
let key = item as! SecKey

Запуск этого кода, я полагаю, сделает то, что вы пытаетесь сделать, в коде, который вы указали в вопросе. Я попытался запустить код, который вы дали, и версия Xcode и swift, которые я использую, дают ошибки компилятора.

Если вы запустите код в этом ответе, вы заметите, что на консоль не выводятся ошибки, указывающие на то, что ключ был успешно найден в цепочке для ключей по умолчанию.

...