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)