目前我有一个应用程序,它有一个“记住我”选项用于存储用户ID。所以存储这个当前我使用的是Keychain API。
但我有一个疑问,如果偶然设备被盗,有人越狱设备。他能从钥匙串中获取所有这些数据吗?
怎么预防这个?
目前我有一个应用程序,它有一个“记住我”选项用于存储用户ID。所以存储这个当前我使用的是Keychain API。
但我有一个疑问,如果偶然设备被盗,有人越狱设备。他能从钥匙串中获取所有这些数据吗?
怎么预防这个?
使用KeyChain时最重要的是不使用 kSecAttrAccessibleAlways
要么 kSecAttrAccessibleAlwaysThisDeviceOnly
因为那时数据没有安全加密(见 Apple的文档)。不使用它们会为KeyChain数据增加一层安全性,但用户仍需要强大的密码来保护他的数据。如果用户在设备上没有密码,则数据不受保护。如果用户具有4位密码(标准),则数据受到非常弱的保护,并且可以在几分钟内强制进行。
如果您需要防止越狱(以及其他攻击),您最好的选择是不使用KeyChain,而是创建自己的加密敏感数据存储,并要求用户拥有安全密码。使用从该密码生成的密钥存储加密的数据。
这可能会给您的用户带来不便,因此如果您希望在需要密码之间提供宽限期,请考虑一种向应用程序提供会话cookie的方法,该方法会在一段时间后失效。
使用KeyChain时最重要的是不使用 kSecAttrAccessibleAlways
要么 kSecAttrAccessibleAlwaysThisDeviceOnly
因为那时数据没有安全加密(见 Apple的文档)。不使用它们会为KeyChain数据增加一层安全性,但用户仍需要强大的密码来保护他的数据。如果用户在设备上没有密码,则数据不受保护。如果用户具有4位密码(标准),则数据受到非常弱的保护,并且可以在几分钟内强制进行。
如果您需要防止越狱(以及其他攻击),您最好的选择是不使用KeyChain,而是创建自己的加密敏感数据存储,并要求用户拥有安全密码。使用从该密码生成的密钥存储加密的数据。
这可能会给您的用户带来不便,因此如果您希望在需要密码之间提供宽限期,请考虑一种向应用程序提供会话cookie的方法,该方法会在一段时间后失效。
为了更加安全,我会在所有内容之上添加另一层安全性,并简单检查设备是否已越狱。如果是这种情况,我会删除当前的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);
这是检查设备是否越狱的最佳方法
bool forked = fork(); if(forked){ //设备已越狱 }