【问题标题】:Is it safe to store Developer's Consumer Secret in Swift code?将开发人员的消费者秘密存储在 Swift 代码中是否安全?
【发布时间】:2018-11-26 02:31:16
【问题描述】:

我目前正在使用 Swift 4.1 开发一个 iOS 应用程序。

由于我的应用程序涉及 Twitter REST API,我需要在我的一个类中提供使用者密钥和使用者密码。 (即开发者的consumer key和secret,用户不需要自己生成key)

想知道将消费者密钥和消费者秘密存储在代码中是否安全,还是需要将它们存储在其他地方?

【问题讨论】:

  • 您可能会存储在您的安全服务器中并在运行时获取它,然后存储在 KeyChain 中。定期撤销/更新它并让应用程序获取新的
  • 是否有可能让人们下载我的应用程序并对应用程序进行逆向工程以获取我的代码中的 API 密钥?

标签: ios swift security oauth


【解决方案1】:

一般来说,如果它足够有价值,任何秘密最终都会被泄露。诀窍是让偷窃变得比偷窃带来的好处更难。

将您的 API 密钥指定为字符串常量是一个非常糟糕的主意。有权访问二进制或中间位码的黑客可以从二进制中提取字符串并寻找高熵常数,这些常数可能是 API 密钥值的候选对象。

小心,也很容易将您的秘密存储在您的 git 存储库中,然后不小心将其发布给全世界。

作为一项改进,请考虑在代码中混淆 API 密钥并在运行时计算实际密钥值。例如,使用简单的异或掩码:

MaskedApiKey = OriginalApiKey XOR Mask

OriginalApiKey = MaskedApiKey XOR Mask

将 MaskedApiKey 和 Mask 存储在您的代码中,并在运行时将它们组合起来以恢复 OriginalApiKey。现在攻击者需要从你的代码中获取两个常量来窃取 API 密钥。您可以扩展此技术以使其在运行时任意混淆。这个的逻辑扩展是white box encryption

如果一个秘密从一开始就没有存储在你的代码中,那么它就更难被窃取。因此,另一种技术是将 API 密钥存储在应用程序之外的外部机密服务中。通过向机密服务注册您的应用程序,该服务可以证明该应用程序是真实且未被篡改的,并在运行时为您的应用程序提供 API 密钥。示例见文末Mobile API Security

当然,如果您的 API 调用是明确的并且很容易被Man in the Middle (MitM) attack 观察到,那么这些都不重要。始终使用 TLS 进行 API 调用 (HTTPS) 由certificate pinning 加强。

查看OWASP talk,快速了解移动 API 安全性。

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2015-03-19
    • 2020-09-21
    • 2014-08-23
    相关资源
    最近更新 更多