Ios Swift上的API密钥存储在哪里?
我有一堆API密钥和机密(Stripe、Cloudinary等),它们目前在我的应用程序中硬编码。哪里是存放它们的合适地方?它们是否应该在服务器中,而我只是将服务器URL存储在我的终端(这样,如果密钥发生变化,应用程序将继续工作) 例如,我的应用程序代理文件中有:Ios Swift上的API密钥存储在哪里?,ios,swift,swift2,stripe-payments,api-key,Ios,Swift,Swift2,Stripe Payments,Api Key,我有一堆API密钥和机密(Stripe、Cloudinary等),它们目前在我的应用程序中硬编码。哪里是存放它们的合适地方?它们是否应该在服务器中,而我只是将服务器URL存储在我的终端(这样,如果密钥发生变化,应用程序将继续工作) 例如,我的应用程序代理文件中有: func configureStripe(){ STPPaymentConfiguration.sharedConfiguration().publishableKey = "pk_test_1234r
func configureStripe(){
STPPaymentConfiguration.sharedConfiguration().publishableKey = "pk_test_1234rtyhudjjfjjs"
STPPaymentConfiguration.sharedConfiguration().appleMerchantIdentifier = "merchant.com.myapp"
}
在Stripe的案例中,这并不重要,因为Stripe的设计就是考虑到这一点的,所以他们要为PCI合规性承担财务责任。他们有更复杂的验证用户和限制访问的方法 首先,您需要记住,您随应用程序交付的每一段代码都有可能被攻击者获取。任何类型的混淆都不会保护它,只会使攻击更加昂贵和耗时
因此,您不应该在源代码中保留任何敏感密钥或机密。您需要考虑存储机密的服务器端解决方案。服务器端解决方案将位于您的应用程序和您实际要调用的API之间。有许多工具可以存储密钥
如果是个人项目,我通常使用
xcconfig
,在git中忽略该文件,但对于团队来说,这可能非常困难。是的,机密密钥应该只在服务器上,永远不要在客户端代码中。如果您想将它们存储在客户端,我相信使用像SSKeyChain
这样的库会有帮助。我不确定Cloudinary,但使用Stripe时,您在客户端上使用的密钥是可发布的密钥。对于与API的任何交互,stripe并不认为它是安全的。这就是为什么您需要使用其他私钥从服务器执行所有操作的原因。永远不要在客户端存储任何东西,但如果绝对必要,不要在应用程序中硬编码,也不要在plist中存储。一个选项是从应用程序向后端发出网络请求,以获取密钥、使用SSL并存储在密钥链中。仍然不是完全安全的,但对于任何不太敏感的东西都应该这样做。我觉得这应该是API的标准,因为今天对于大多数其他API,客户端负责安全地使用这些机密…即使它们符合PCI标准,但您应该关心您的API密钥,这样就不会有人使用您的密钥。