Realm Encryption,Secure Enclave和Keychain

时间:2017-12-04 10:20:33

标签: ios swift encryption realm keychain

很抱歉这是关于加密的另一篇文章,但我正在努力在我的应用程序中设置一些真正强大的加密。我目前有一个基本的登录设置,利用钥匙串,基于Tim Mitra's tutorial,这非常有效。但是,我对在UserDefaults中存储帐户电子邮件/用户名感到不舒服,因为它不是特别安全。 是否有更好的方法可供任何人提出?此外,我正在努力利用Realm的内置加密功能,但我不确定如何正确存储用于所述加密的密钥,因为它是Data类型。我也听说过我应该使用Secure Enclave对用户的凭据进行双重加密,并且可能使用与Realm密钥相同的技术。 是否有人可以指向我的指南? 您如何更好地优化我的代码以保护其安全?我已经将应用程序设置为检查设备是否有Cydia和其他越狱迹象,以避免钥匙串数据转储,并计划检查任何/所有网址。

这是我对Keychain的实现:

private func setupAccount()
{
    let newAccountName = inputFields[0].text
    let newPassword = inputFields[1].text
    let hasLoginKey = UserDefaults.standard.bool(forKey: "hasSetup")
    if !hasLoginKey {
        UserDefaults.standard.setValue(inputFields[0].text, forKey: "username")
    }

    do {

        // This is a new account, create a new keychain item with the account name.
        let passwordItem = KeychainLIPassItem(service: KeychainConfiguration.serviceName,
                                              account: newAccountName!,
                                                accessGroup: KeychainConfiguration.accessGroup)

        // Save the password for the new item.
        try passwordItem.savePassword(newPassword!)
    } catch {
        fatalError("Error updating keychain - \(error)")
    }

    UserDefaults.standard.set(true, forKey: "hasSetup")
}

以下是我目前对Realm Encryption的看法:

private func keyValue() -> Data
{
    var key = Data(count: 64)
    _ = key.withUnsafeMutableBytes { bytes in
        SecRandomCopyBytes(kSecRandomDefault, 64, bytes)
    }
    return key
}

private func securitySettings() -> Realm.Configuration
{  
    let key = keyValue()

    let config = Realm.Configuration(encryptionKey: key)
    return config
}

private func setupObject()
{
    do {
        let realm = try Realm(configuration: securitySettings())

        let profile = UserProfile()
        profile.firstName = firstName
        profile.lastName = lastName
        profile.dateOfBirth = dateOfBirth
        profile.gender = gender
        try! realm.write {
            realm.add(profile)
        }
    } catch let error as NSError {
        fatalError("Error opening realm: \(error)")
    }
}

非常感谢你!

0 个答案:

没有答案