问题 如果设备被监禁,则删除钥匙串数据


目前我有一个应用程序,它有一个“记住我”选项用于存储用户ID。所以存储这个当前我使用的是Keychain API。

但我有一个疑问,如果偶然设备被盗,有人越狱设备。他能从钥匙串中获取所有这些数据吗?

怎么预防这个?


3901
2018-03-03 05:44


起源



答案:


使用KeyChain时最重要的是不使用 kSecAttrAccessibleAlways 要么 kSecAttrAccessibleAlwaysThisDeviceOnly 因为那时数据没有安全加密(见 Apple的文档)。不使用它们会为KeyChain数据增加一层安全性,但用户仍需要强大的密码来保护他的数据。如果用户在设备上没有密码,则数据不受保护。如果用户具有4位密码(标准),则数据受到非常弱的保护,并且可以在几分钟内强制进行。

如果您需要防止越狱(以及其他攻击),您最好的选择是不使用KeyChain,而是创建自己的加密敏感数据存储,并要求用户拥有安全密码。使用从该密码生成的密钥存储加密的数据。

这可能会给您的用户带来不便,因此如果您希望在需要密码之间提供宽限期,请考虑一种向应用程序提供会话cookie的方法,该方法会在一段时间后失效。


8
2018-03-08 15:28



SQLCipher可以解决这类问题吗? - raaz
@raaz是的,它可以,但这取决于你真的需要这么大的框架(SQLite + sqlcipher)。 - Leo Natan
Leo-natan你有任何商业或开源的建议吗? - raaz
@raaz看看这个项目: github.com/nicerobot/objc/tree/master/NSData/NSData%2BAES 为您提供加密类别 NSData。现在,您可以使用任何可以序列化为数据的对象(例如字典)并在保存到磁盘之前将其加密。 - Leo Natan
Leo natan谢谢,我会检查一下。 - raaz


答案:


使用KeyChain时最重要的是不使用 kSecAttrAccessibleAlways 要么 kSecAttrAccessibleAlwaysThisDeviceOnly 因为那时数据没有安全加密(见 Apple的文档)。不使用它们会为KeyChain数据增加一层安全性,但用户仍需要强大的密码来保护他的数据。如果用户在设备上没有密码,则数据不受保护。如果用户具有4位密码(标准),则数据受到非常弱的保护,并且可以在几分钟内强制进行。

如果您需要防止越狱(以及其他攻击),您最好的选择是不使用KeyChain,而是创建自己的加密敏感数据存储,并要求用户拥有安全密码。使用从该密码生成的密钥存储加密的数据。

这可能会给您的用户带来不便,因此如果您希望在需要密码之间提供宽限期,请考虑一种向应用程序提供会话cookie的方法,该方法会在一段时间后失效。


8
2018-03-08 15:28



SQLCipher可以解决这类问题吗? - raaz
@raaz是的,它可以,但这取决于你真的需要这么大的框架(SQLite + sqlcipher)。 - Leo Natan
Leo-natan你有任何商业或开源的建议吗? - raaz
@raaz看看这个项目: github.com/nicerobot/objc/tree/master/NSData/NSData%2BAES 为您提供加密类别 NSData。现在,您可以使用任何可以序列化为数据的对象(例如字典)并在保存到磁盘之前将其加密。 - Leo Natan
Leo natan谢谢,我会检查一下。 - raaz


为了更加安全,我会在所有内容之上添加另一层安全性,并简单检查设备是否已越狱。如果是这种情况,我会删除当前的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);

1
2018-03-09 08:21



这是一个糟糕的主意。首先,所有这些都可以轻易避开。仅仅因为设备被越狱,并不意味着应用程序不在沙箱中。所以你的第一个例子是nada。 Bash并不总是安装。事实上,大多数人都没有安装它。第二个例子 - 虚无...此外,删除钥匙串只会在应用程序运行时发生。与此同时,越狱允许访问钥匙串数据。 - Leo Natan
以上是检测您的设备是否已越狱的常用方法。点击这里: stackoverflow.com/questions/413242/... 。顺便说一句,第二个例子是Skype如何做到这一点(远离“虚无”)。当然,应用程序需要运行才能运行。这就是我写“添加另一层安全”的原因,而不仅仅依赖于上述内容。 - Segev
是的,它们是获得虚假希望的常见方式。它们非常不可靠。人们不应该在这里有误解 - 如果他们想要超越越狱的安全性,他们必须在操作系统之外自己实施。 - Leo Natan
深度防御是关键所在,是的,这些并非万无一失的越狱检测机制,但对于一些简单的代码,它增加了一层防御,在某些情况下会有所帮助。 - Tim
@Jeff是的,但是你能做到最好吗?把希望寄托在越狱检查上并不是最佳选择。 - Leo Natan


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

检查的代码

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

0
2018-03-15 14:43





检查此链接 钥匙扣项目,您可以枚举所有钥匙串项目。

你也可以使用 保护属性 保护信息。

Apple Docs

好读


0
2018-03-17 12:38