代码之家  ›  专栏  ›  技术社区  ›  slugz

Swift 4钥匙链secitemupdate错误状态代码-50

  •  0
  • slugz  · 技术社区  · 6 年前

    我正在尝试使用一些密钥链代码来安全持久地存储一些敏感数据。我有保存和读取数据的功能,这些功能可以正常工作,但我似乎无法使更新的功能正常工作。

    let kSecClassValue = NSString(format: kSecClass)
    let kSecAttrAccountValue = NSString(format: kSecAttrAccount)
    let kSecValueDataValue = NSString(format: kSecValueData)
    let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)
    let kSecAttrServiceValue = NSString(format: kSecAttrService)
    let kSecMatchLimitValue = NSString(format: kSecMatchLimit)
    let kSecReturnDataValue = NSString(format: kSecReturnData)
    let kSecMatchLimitOneValue = NSString(format: kSecMatchLimitOne)
    
    
    public class KeychainService: NSObject {
        class func updatePassword(service: String, account:String, data: String) {
            if let dataFromString: Data = data.data(using: String.Encoding.utf8, allowLossyConversion: false) {
                // Instantiate a new default keychain query
                let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, account, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue])
                let status = SecItemUpdate(keychainQuery as CFDictionary, [kSecValueDataValue:dataFromString] as CFDictionary)
                if (status != errSecSuccess) {
                    if let err = SecCopyErrorMessageString(status, nil) {
                        print("Read failed: \(err)")
                        print("status: \(status)")
                    }
                }
            }
        }
    ...
    

    我不断得到错误状态-50,表示传递给函数的一个或多个参数无效。我试着看完那些文件,但没能想出任何有效的办法。

    提前谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   slugz    6 年前

    结果我不得不从keychainquery字典中删除最后两个键,所以看起来是这样的:

    public class KeychainService: NSObject {
        class func updatePassword(service: String, account:String, data: String) {
            if let dataFromString: Data = data.data(using: String.Encoding.utf8, allowLossyConversion: false) {
                // Instantiate a new default keychain query
                let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, account], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue])
                let status = SecItemUpdate(keychainQuery as CFDictionary, [kSecValueDataValue:dataFromString] as CFDictionary)
                if (status != errSecSuccess) {
                    if let err = SecCopyErrorMessageString(status, nil) {
                        print("Read failed: \(err)")
                        print("status: \(status)")
                    }
                }
            }
        }
    ...