很抱歉这是关于加密的另一篇文章,但我正在努力在我的应用程序中设置一些真正强大的加密。我目前有一个基本的登录设置,利用钥匙串,基于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)")
}
}
非常感谢你!