如果设备越狱,请删除钥匙串数据。

11

目前我有一个应用程序,它具有存储用户ID的“记住我”选项。因此,我目前正在使用Keychain API来存储此信息。

但是我担心如果设备被盗并且有人越狱了该设备,他是否能够从Keychain中获取所有这些数据?

如何防止这种情况发生?

4个回答

8
使用KeyChain时最重要的是不要使用kSecAttrAccessibleAlwayskSecAttrAccessibleAlwaysThisDeviceOnly,因为数据没有得到安全加密(详见苹果文档)。不使用这些会为KeyChain数据增加一层安全保护,但仍需要用户设置强密码来保护他的数据。如果用户的设备上没有设置密码,那么数据就是不受保护的。如果用户设置了4位数字密码(标准密码),则数据的保护非常脆弱,可以在几分钟内被暴力破解。
如果您需要保护免越狱(和其他攻击),最好的选择就是不使用KeyChain,而是创建自己的加密敏感数据存储,并要求用户设置安全密码。使用由该密码生成的密钥来加密存储数据。
这可能会给您的用户带来不便,所以如果您希望在要求密码之间提供宽限期,请考虑一种方式,向应用程序提供一个会话cookie,在一定时间后失效。

SQLCipher能否成为解决这类问题的方案? - raaz
@raaz 是的,可以这样做,但这取决于您是否真的需要这样一个庞大的框架(SQLite + sqlcipher)。 - Léo Natan
Leo-natan,你有任何商业或开源建议吗? - raaz
1
@raaz 请看一下这个项目:https://github.com/nicerobot/objc/tree/master/NSData/NSData%2BAES/。它为`NSData`提供了加密类别。现在,您可以使用任何可序列化为数据的对象(例如字典),并在保存到磁盘之前对其进行加密。 - Léo Natan
@raaz 我的解决方案有帮到你吗? - Léo Natan

2

为了更加安全,我建议在现有的所有安全措施之上再增加一层,并检查设备是否越狱。如果是这种情况,我会删除当前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);

这是一个可怕的想法。首先,所有这些都可以轻松地被规避。仅仅因为设备越狱了,并不意味着应用程序不在沙盒中。所以你的第一个例子是无效的。Bash并不总是被安装的。事实上,大多数人都没有安装它。第二个例子也是无效的。此外,只有在运行应用程序时才会删除钥匙串。与此同时,越狱允许访问钥匙串数据。 - Léo Natan
1
以上是检测设备是否越狱的常见方法。请查看此处:https://dev59.com/PHRC5IYBdhLWcg3wFdFx 。顺便说一下,第二个示例是Skype使用的方法(远非“nada”)。当然,应用程序需要运行才能正常工作。这就是为什么我写“添加另一层安全性”,而不仅仅依赖于上述方法。 - Segev
1
是的,它们是获得虚假希望的常见方式。它们非常不可靠。在这里,人们不应该有误解 - 如果他们想要超越越狱的安全性,他们必须在操作系统之外自己实现它。 - Léo Natan
1
深度防御是关键,是的,这些并不是绝对可靠的越狱检测机制,但对于一个简单的代码来说,它增加了一层防御,在某些情况下会有所帮助。 - Tim
@Jeff 是的,但是尽力而为不是更好吗?把希望寄托在越狱检查上并不是最优解。 - Léo Natan
当然,每一层都有帮助。绝对不建议仅使用此方法来防止数据库被盗。 - Tim

0

这是检查设备是否越狱的最佳方法

检查代码

bool forked = fork();
if (forked) {
    // 设备已越狱
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接