2017-02-07 23 views
3

Googleでは検出されましたが、迅速にキーチェーンにこの属性を設定する方法については何も見つかりませんでした。 Obj-Cにはいくつかのビットと断片がありますが、キーチェーンとObj-Cのスウィフト使用法の対応はほとんど不可能です。キーチェーンのアクセスをSwiftのkSecAttrAccessibleAfterFirstUnlockに設定するにはどうすればよいですか?

暗号化キーを設定するために既存のコード(Realm Swiftのドキュメント)がありますが、デフォルトからkSecAttrAccessibleAfterFirstUnlockへのアクセスを設定する必要があります。

class func getKey() -> NSData { 
    let keychainIdentifier = "Realm.EncryptionKey" 
    let keychainIdentifierData = keychainIdentifier.data(using: String.Encoding.utf8, allowLossyConversion: false)! 

    // First check in the keychain for an existing key 
    var query: [NSString: AnyObject] = [ 
     kSecClass: kSecClassKey, 
     kSecAttrApplicationTag: keychainIdentifierData as AnyObject, 
     kSecAttrKeySizeInBits: 512 as AnyObject, 
     kSecReturnData: true as AnyObject 
    ] 


    var dataTypeRef: AnyObject? 
    var status = withUnsafeMutablePointer(to: &dataTypeRef) { SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) } 
    if status == errSecSuccess { 
     return dataTypeRef as! NSData 
    } 

    // No pre-existing key from this application, so generate a new one 
    let keyData = NSMutableData(length: 64)! 
    let result = SecRandomCopyBytes(kSecRandomDefault, 64, keyData.mutableBytes.bindMemory(to: UInt8.self, capacity: 64)) 
    assert(result == 0, "Failed to get random bytes") 

    // Store the key in the keychain 
    query = [ 
     kSecClass: kSecClassKey, 
     kSecAttrApplicationTag: keychainIdentifierData as AnyObject, 
     kSecAttrKeySizeInBits: 512 as AnyObject, 
     kSecValueData: keyData 
    ] 

    status = SecItemAdd(query as CFDictionary, nil) 

    return keyData 
} 

答えて

1

は、キーを追加するために使用したクエリの辞書にkSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlockを追加します。

アクセシビリティステータスを既に追加した後に更新する場合は、SecItemUpdateに渡す辞書のkSecValueDatakSecAttrAccessibleのキーを指定する必要があります。

+0

これは私にヘッドバンギングの時間を節約しました(そして私はメタリカが関与していないことを認めます) –

関連する問題