目前我有一个应用程序,它有一个“记住我”选项用于存储用户ID。所以当前我正在使用Keychain API存储它。
但我怀疑是否偶然设备被盗并且有人越狱了设备。他能从钥匙串中获取所有这些数据吗?
如何防止这种情况?
答案 0 :(得分:8)
使用KeyChain时最重要的一点是不要使用kSecAttrAccessibleAlways
或kSecAttrAccessibleAlwaysThisDeviceOnly
,因为这样数据不会安全加密(请参阅Apple's documentation)。不使用它们会为KeyChain数据增加一层安全性,但用户仍需要强大的密码来保护他的数据。如果用户在设备上没有密码,则数据不受保护。如果用户有一个4位数的密码(标准),则数据受到非常微弱的保护,可以在几分钟内强制进行。
如果您需要防止越狱(以及其他攻击),您最好的选择是不使用KeyChain,而是创建自己的加密敏感数据存储,并要求用户拥有安全密码。使用从该密码生成的密钥存储加密的数据。
这可能会给您的用户带来不便,因此如果您希望在要求密码之间提供宽限期,请考虑一种向应用提供会话Cookie的方法,该方式会在一段时间后失效。
答案 1 :(得分:1)
为了更安全,我会在所有内容上添加另一层安全性,并简单检查设备是否已越狱。如果是这种情况,我会删除当前的KeyChain \敏感数据。
类似的东西:
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
//Device is jailbroken --> delete KeyChain
}
甚至更好:
FILE *f = fopen("/bin/bash", "r");
BOOL isbash = NO;
if (f != NULL)
{
//Device is jailbroken --> delete KeyChain
isbash = YES;
}
fclose(f);
答案 2 :(得分:0)
这是检查设备越狱的最佳方法
bool forked = fork(); if (forked) { // Device is jailbroken }
答案 3 :(得分:0)