在 Swift 上的哪里存储 API 密钥?
Posted
技术标签:
【中文标题】在 Swift 上的哪里存储 API 密钥?【英文标题】:Where to store API keys on Swift? 【发布时间】:2017-07-07 18:29:00 【问题描述】:我有一堆 API 密钥和机密(Stripe、Cloudinary 等),目前在我的应用程序中进行了硬编码。存放它们的正确位置在哪里?它们是否应该在服务器中,而我只是将服务器 URL 存储在我的末尾(这样如果密钥发生更改,应用程序将继续工作)?
例如,我的应用委托文件中有这个:
func configureStripe()
STPPaymentConfiguration.sharedConfiguration().publishableKey = "pk_test_1234rtyhudjjfjjs"
STPPaymentConfiguration.sharedConfiguration().appleMerchantIdentifier = "merchant.com.myapp"
【问题讨论】:
是的,密钥绝对应该只在您的服务器上,并且永远不会在客户端代码中。 如果您想将它们存储在客户端,我相信使用像SSKeyChain
这样的库会有所帮助
我不确定 Cloudinary 但使用 Stripe,您在客户端上使用的密钥是可发布密钥。对于与 API 的任何交互,条带化认为这不是安全的。这就是为什么您需要使用您的其他私钥从服务器执行所有操作的原因。永远不要存储任何私人客户端,但如果绝对必要,请不要在应用程序中硬编码或存储在 plist 中。一种选择是从您的应用程序向您的后端发出网络请求,以获取密钥、使用 SSL 并存储在钥匙串中。仍然不完全安全,但应该做任何不是主要敏感的事情。
【参考方案1】:
有很多工具可以存储密钥。
-
https://nshipster.com/secrets/
https://www.freecodecamp.org/news/how-to-securely-store-api-keys-4ff3ea19ebda/
如果是个人项目,我通常会使用 xccconfig
并忽略 git 中的该文件,但对于团队来说这可能会非常困难。
【讨论】:
【参考方案2】:首先,您需要记住,您随应用提供的每一段代码都可能被攻击者获取。任何形式的混淆都无法保护它,只会使攻击更加昂贵和耗时。
因此,您不应在源代码中保留任何敏感密钥或机密。您需要考虑用于存储机密的服务器端解决方案。服务器端解决方案将位于您的应用和您实际要调用的 API 之间。
【讨论】:
【参考方案3】:就 Stripe 而言,Stripe 的设计考虑到这一点并不重要,重要的是他们承担了 PCI 合规性的财务责任。他们有更复杂的方法来验证用户和限制访问。
【讨论】:
我觉得这应该是 API 的规范,因为今天对于大多数其他 API,客户端负责安全地使用机密...... 尽管它们符合 PCI 标准,但您应该注意您的 API 密钥,以免有人使用您的密钥。以上是关于在 Swift 上的哪里存储 API 密钥?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里/如何在 Google Colabs 中安全地存储 API 密钥?