我目前正在使用 Swift 4.1 开发 iOS 应用。
由于我的应用涉及Twitter REST API,我需要在其中一个类中提供消费者密钥和消费者密钥。 (即开发者的消费者密钥和秘密,用户不需要生成自己的密钥)
想知道是否安全将消费者密钥和消费者密钥存储在代码中,还是我需要将它们存储在其他地方?
答案 0 :(得分:2)
通常来说,如果它足够有价值,那么任何秘密都会最终被泄露。诀窍是使盗窃比盗窃所带来的收益更难。
将API密钥指定为字符串常量是一个非常糟糕的主意。有权访问二进制或中间位码的黑客可以从二进制文件中提取字符串,并寻找高熵常数,这些常数很可能是API密钥值。
请注意,将您的秘密存储在git存储库中并意外地将其发布给全世界也很容易。
作为改进,请考虑对代码中的API密钥进行混淆,并在运行时计算实际的密钥值。例如,使用简单的“异或”掩码:
MaskedApiKey = OriginalApiKey XOR Mask
OriginalApiKey = MaskedApiKey XOR Mask
将MaskedApiKey和Mask存储在您的代码中,并在运行时将它们组合以还原OriginalApiKey。现在,攻击者需要从您的代码中获取两个常量以窃取API密钥。您可以扩展此技术,以使其在运行时任意模糊。其逻辑扩展为white box encryption
如果永远不会将秘密存储在您的代码中,那么甚至更难以窃取它。因此,另一种技术是将API密钥存储在应用程序外部的秘密服务中。通过在Secrets Service中注册您的应用程序,该服务可以证明该应用程序是真实的且不受篡改,并在运行时为您的应用程序提供API密钥。有关示例,请参见文章结尾处的Mobile API Security。
当然,如果您的API调用是明晰的并且很容易被Man in the Middle (MitM) attack观察到,那么这些都不重要。始终使用TLS进行API调用 (HTTPS)得到certificate pinning的加强。
请查看此OWASP talk,以快速了解移动API的安全性。