iOS在钥匙串中存储IAP标志,所以它是安全的

Posted

技术标签:

【中文标题】iOS在钥匙串中存储IAP标志,所以它是安全的【英文标题】:iOS Storing IAP flag in Keychain so it's secure 【发布时间】:2016-01-06 11:49:09 【问题描述】:

我正在实施钥匙串来存储成功 IAP 的标志。我对此有一些关于安全性的问题,因为我不知道破解我的应用程序的人可以看到哪些对象。

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"theKey" accessGroup:nil];

[wrapper setObject:@"password" forKey:(id)kSecValueData];

如果我在上面的setObjectForKey 方法中输入密码,有人能在可执行文件中看到密码文字或变量吗?当我设置这个时,它不是“赤裸裸的”并且容易被邪恶的黑客抓住吗?

【问题讨论】:

是的,它是赤裸裸的,如果黑客对谷歌了解一点的话:)。您最好不要将“裸”密码存储在任何地方,在黑客获取您的密码之前,散列甚至加密密码可以给您更多时间。 我该怎么做,因为在某些时候它必须是赤裸的?请记住,我必须存储一些布尔标志以了解用户是否进行了 IAP,而不是存储身份验证密码。 @FahriAzimov 我刚刚看了看,发现 SKPaymentTransaction 有一个 transactionIdentifier 属性,它是一个唯一的字符串。你觉得用这个作为密码怎么样?我不相信它会在 SKPaymentTransaction 成功返回之前生成。 您到底想防范什么? IAP 的安全问题来自越狱设备,在这些设备上,您不能信任任何东西。您唯一的选择是对收据使用(安全的)服务器端验证。 @jcaron 是否有您可以提供解释服务器端验证的链接?基本上我想存储一个布尔标志,表明它已被购买。 【参考方案1】:

您的安全顾虑是用户会更改文件,因此现在读取“IAP 尚未购买”而不是“IAP 已购买”。避免这种情况的最简单方法是通过将用户的 identifierForVendor 存储在文件变量中,甚至是 NSUserDefault 中来指示 IAP 已被购买。每个设备的 identifierForVendor 都不同。如果您想增加安全性,请创建一个 identifierForVendor 的哈希值和一个只有您知道的秘密字符串,例如“我的秘密”。

【讨论】:

以上是关于iOS在钥匙串中存储IAP标志,所以它是安全的的主要内容,如果未能解决你的问题,请参考以下文章

访问钥匙串中的安全项目有时会在 iOS 中返回错误 -25308 (errSecInteractionNotAllowed)

将设备标识符存储在 iOS 应用程序的钥匙串中是个好主意吗

iOS:新设备或恢复设备上的钥匙串

如何从存储在 iOS 钥匙串中的密钥中获取 DER 格式的公钥?

钥匙串中存储的字符串是不是有长度限制?

在苹果钥匙串中存储和读取密码的简单方法?