Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift上的API密钥存储在哪里?_Ios_Swift_Swift2_Stripe Payments_Api Key - Fatal编程技术网

Ios Swift上的API密钥存储在哪里?

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

我有一堆API密钥和机密(Stripe、Cloudinary等),它们目前在我的应用程序中硬编码。哪里是存放它们的合适地方?它们是否应该在服务器中,而我只是将服务器URL存储在我的终端(这样,如果密钥发生变化,应用程序将继续工作)

例如,我的应用程序代理文件中有:

    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密钥,这样就不会有人使用您的密钥。