在Swift中存储API密钥的位置是哪里?

23

我有一堆API密钥和密钥(Stripe,Cloudinary等),它们目前是硬编码在我的应用程序中的。存储它们的正确位置在哪里?它们应该在服务器上,并且我只需在我的端点存储服务器URL(这样如果密钥更改,应用程序仍将继续工作)吗?

例如,我在我的应用程序委托文件中有这样的代码:

    func configureStripe(){
            STPPaymentConfiguration.sharedConfiguration().publishableKey = "pk_test_1234rtyhudjjfjjs"         

STPPaymentConfiguration.sharedConfiguration().appleMerchantIdentifier = "merchant.com.myapp"
    }

1
是的,密钥绝对应该只存在于您的服务器上,永远不会出现在客户端代码中。 - l'L'l
如果你想在客户端存储它们,我相信使用像SSKeyChain这样的库会很有帮助。 - KrishnaCA
5
我不确定Cloudinary,但是在Stripe中,您在客户端使用的密钥是一个publishableKey。这不被Stripe视为与其API进行任何交互的安全内容。所以,您需要使用其他私钥从服务器上执行所有操作。请勿将任何私人内容存储在客户端上,但如果绝对必要,请勿在应用程序中硬编码或存储在plist文件中。一种选择是从应用程序向后端发起网络请求获取密钥,使用SSL,并存储在keychain中。虽然仍不完全安全,但对于非极度敏感的内容应该足够了。 - JustinM
4个回答

4

1
首先,您需要记住的是,您应用程序中提供的每一行代码都可能被攻击者获得。任何形式的混淆都无法保护它,只会使攻击变得更加昂贵和耗时。

因此,您不应该将任何敏感的密钥或秘密信息存储在源代码中。您需要考虑服务器端解决方案来存储机密信息。服务器端解决方案将位于您的应用程序和实际调用的API之间。

0

我建议将其存储在.pinfolist文件中,不要上传到Git


-3
在Stripe的情况下,这并不太重要,因为Stripe是考虑到这一点而设计的,以至于他们承担了PCI合规性的财务责任。他们有更复杂的方法来验证用户和限制访问。

我觉得这应该成为API的规范,因为对于大多数其他API,客户端负责安全地使用密码。 - alexisSchreier
即使它们符合PCI合规性,但您仍应关注您的API密钥,以防止其他人使用您的密钥。 - Rehan Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接