Смена ключа шифрования базы данных

Для смены ключа шифрования базы данных создайте приложение «HHFWRekeyBase», в котором используются методы фреймворка:

Имя метода Краткое описание
initWithCredentials (_: host: environment: project: device:) Метод выполняет инициализацию фреймворка.
auth (_: password:) Метод выполняет аутентификацию пользователя по логину и паролю.
openBase (_: key:) Метод открывает соединение с базой данных по указанному пути.
closeBase (_:) Метод закрывает соединение с базой данных.
rekeyBase (_: newKey:) Метод выполняет смену ключа шифрования базы данных по указанному пути.

Вспомогательный метод:

Имя метода Краткое описание
getURL (for:) Метод возвращает URL для файла с заданным именем в папке «Documents».
Тип возвращаемых данных: URL.

Приложение «HHFWRekeyBase» состоит из одного экрана, текстового представления «UITextView», текстового поля «UITextField» и кнопок «UIButton»:

Примечание. При загрузке приложения выполняется аутентификация, кнопки и текстовое поле недоступны. Если аутентификация выполнена успешно, то кнопки и текстовое поле будут доступны и в текстовом представлении появится надпись «Authentication and resources load success».

Для выполнения примера:

  1. Введите в текстовое поле первичный ключ шифрования базы данных и нажмите кнопку «Open Database».

При нажатии на кнопку происходит открытие соединения или создание базы данных с указанным первичным ключом. В текстовом представлении описывается результат выполнения метода.

  1. Введите в текстовое поле новый ключ шифрования базы данных и нажмите кнопку «Rekey Database».

При нажатии на кнопку происходит смена ключа шифрования базы данных. В текстовом представлении описывается результат выполнения метода.

  1. Введите в текстовое поле первичный ключ шифрования базы данных и нажмите кнопку «Open Database».

При нажатии на кнопку происходит закрытие предыдущего соединения с базой данных и попытка открытия нового соединения с первичным ключом. В текстовом представлении описывается результат выполнения метода.

  1. Введите в текстовое поле новый ключ шифрования базы данных, который был указан в пункте 2, и нажмите кнопку «Open Database».

При нажатии на кнопку происходит закрытие предыдущего соединения с базой данных и попытка открытия нового соединения с новым ключом. В текстовом представлении описывается результат выполнения метода.

Код приложения:

import UIKit
 
class ViewController: UIViewController {
 
    // Объявим элементы пользовательского интерфейса
    @IBOutlet weak var keyTextField: UITextField!
    @IBOutlet weak var openDatabaseButton: UIButton!
    @IBOutlet weak var rekeyDatabaseButton: UIButton!
    @IBOutlet weak var resultTextView: UITextView!
 
    // Выполним методы цикла отображения пользовательского интерфейса
    override func viewDidLoad() {
        super.viewDidLoad()
        self.deactivateViews()
        self.initializeFramework()
        self.auth {
            self.activateViews()
            self.resultTextView.text = "Authentication success"
        }
    }
 
    // Зададим методы для обработки событий, инициированных пользователем из пользовательского интерфейса
    @IBAction func openDatabasePressed(_ sender: UIButton) {
        let databaseName = "database.sqlite"
        self.closeDatabase(databaseName)
        let key = self.keyTextField.text ?? ""
        self.resultTextView.text = "Open base with key \"\(key)\" success: \(self.openDatabase(databaseName, key: key))"
    }
    @IBAction func rekeyDatabasePressed(_ sender: UIButton) {
        let databaseName = "database.sqlite"
        let newKey = self.keyTextField.text ?? ""
        self.resultTextView.text = "Rekey base with new key \"\(newKey)\" success: \(self.rekeyDatabase(databaseName, newKey: newKey))"
    }
 
    // Выполним инициализацию фреймворка
    private func initializeFramework() {
        let apiVersion: String = "v1"
        let host: String = "http://testmasterfmp.fsight.cloud/"
        let environment: String = "DocumentationExampleEnv"
        let project: String = "DocumentationExampleProj"
        let device: String = (UIDevice.current.identifierForVendor?.uuidString)!
        HHFWController.sharedInstance().initWithCredentials(
            apiVersion,
            host: host,
            environment: environment,
            project: project,
            device: device
        )
    }
 
    // Выполним аутентификацию
    private func auth(completion: @escaping ()->()) {
        let username: String = "test"
        let password: String = "test123"
        HHFWController.sharedInstance().auth(username, password: password){ (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Auth success")
                completion()
            } else {
                print("Auth error")
            }
        }
    }
 
    // Откроем или создадим базу данных
    private func openDatabase(_ databaseName: String, key: String) -> Bool {
        let fullDatabaseURL = self.getURL(for: databaseName)
        return HHFWController.sharedInstance().openBase(fullDatabaseURL.path, key: key)
    }
 
    // Сменим ключ шифрования базы данных
    private func rekeyDatabase(_ databaseName: String, newKey: String) -> Bool {
        let fullDatabaseURL = self.getURL(for: databaseName)
        return HHFWController.sharedInstance().rekeyBase(fullDatabaseURL.path, newKey: newKey)
    }
 
    // Закроем базу данных
    private func closeDatabase(_ databaseName: String) -> Bool {
        let fullDatabaseURL = self.getURL(for: databaseName)
        return HHFWController.sharedInstance().closeBase(fullDatabaseURL.path)
    }
 
    // Выполним вспомогательные методы
    private func getURL(for fileName: String) -> URL {
        let paths: [URL] = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let fileURL: URL = paths[0].appendingPathComponent(fileName)
        return fileURL
    }
 
    // Зададим методы для изменения элементов отображения пользовательского интерфейса
    private func deactivateViews() {
        self.keyTextField.isEnabled = false
        self.openDatabaseButton.isEnabled = false
        self.rekeyDatabaseButton.isEnabled = false
    }
    private func activateViews() {
        self.keyTextField.isEnabled = true
        self.openDatabaseButton.isEnabled = true
        self.rekeyDatabaseButton.isEnabled = true
    }
}

См. также:

Примеры использования iOS-фреймворка | Примеры работы с ресурсами