假设用户在我的应用中启用了Touch ID。我需要在某个地方保存这个状态。我有两个选择:NSUserDefaults和Keychain。
NSUserDefaults :在NSUserDefaults中存储布尔值fingerprintEnabled
的问题是此标志可以是modified。因此,对设备具有物理访问权限的攻击者只需编辑此标记并绕过我的应用程序中的指纹身份验证,即可访问用户的安全脱机数据。
钥匙串:这很好,因为它是加密的,无法在外部修改。但是,钥匙串值会在应用安装/卸载过程中保留。如果用户卸载应用程序,可能是因为Touch ID无法正常运行并重新安装,即使新应用程序安装应重置所有状态,它仍会提示Touch ID。
那么哪里是存储状态的最佳位置,是否需要指纹认证?
答案 0 :(得分:0)
如果您非常担心NSUserDefaults中保存的数据的安全性,为什么不使用 NSUserDefaults 和 Keychain
的组合?在 NSUserDefaults 中保存变量,可以说installed
。您可以在AppDelegates didFinishLaunchWithOptions
中将其设置为true。如果您在钥匙串中重置fingerprintEnabled
的值,则可以将其用作参考。
将其保存在钥匙链中的问题是您不知道何时重置它。现在, NSUserDefaults 中的值可帮助您决定何时重置此值。
由于在卸载应用时将删除 NSUserDefaults 中的值,因此当您卸载并重新安装{strong> NSUserDefaults 中的installed
值时,您将不在如果存在,可以继续重置钥匙串中fingerprintEnabled
的值(显然,应该在设置didFinishLaunchWithOptions
之前在installed
中完成此操作。)
在后续发布时,installed
的值会阻止您重置fingerprintEnabled
的值。
我知道这不是最有效的方法,因为它同时使用NSUserDefaults和KeyChain,但解决了这个问题。
答案 1 :(得分:0)
如果使用NSUserDefaults
不安全,使用钥匙串也不安全,所以我会使用NSUserDefaults
,因为它更容易实现。让我解释一下:如果用户只能编辑用户默认值并访问数据,则表示数据未加密。 (或者至少,如果您可以访问应用程序的源代码,它的加密方式很容易破解。)如果数据未加密并且您使用keychain存储布尔值,则用户也可以只修补二进制文件省略了钥匙串检查。或者他可能只是在应用程序二进制文件中找到未加密的有效负载并检查它。
但现在更具建设性...... :)实施Touch ID保护的最佳方法是使用Touch ID解锁密钥,并使用该密钥加密有效负载数据 。如果禁用Touch ID,则只需使用硬编码密钥(并使用某种基本的运行时混淆,如base64_decode,以使攻击者不太容易。)您可以在用户默认值中存储布尔值(例如“data_encryption_enabled”) *。如果是YES
,则向系统询问“data_access”项的密钥。然后用该密钥解密数据(我建议使用AES128)。如果“data_encryption_enabled”为NO
,则使用“9fajw9e8”作为密钥。很容易看出,如果攻击者设法将“data_encryption_enabled”更改为NO
,则无法解锁数据。
还有一些事情需要考虑:
YES
/ true
的“文档”),则这不是问题。SecRandomCopyBytes
)*)此示例中的所有字符串都由我组成,您可以随意选择它们。