我正在使用Goodreads api获取我的react本机应用程序的图书数据。我必须使用密钥才能使用api。我可以将api密钥存储在应用程序本身上吗,还是应该将密钥放在将所有数据重定向到应用程序的服务器上?
答案 0 :(得分:1)
我可以在应用程序本身上存储api密钥
否,因为正如我在文章How to Extract an API Key from a Mobile App by Static binary analysis中所演示的那样,可以借助几种开源工具(例如,使用Mobile Security Framework来将其提取,但是您也可以使用正如我在文章Steal that API Key with a Man in the Middle Attack中所展示的,MitM攻击使用了开源工具MiTM Proxy。
如果您在移动应用程序中保留了第三方API密钥,那么攻击者就可以抓住它们,当他们在不知情的情况下开始使用它时,您在承认之前,第三方提供商中的账单可能会被吞噬出了点问题,那时候唯一的解决方案是撤销API密钥,从而关闭移动应用程序的使用,如果您使用新的API密钥制作了新版本的移动应用程序,那将是一个问题几小时后攻击者才会回来并再次窃取API密钥。
还是应该将密钥放在将所有数据重定向到应用程序的服务器上?
是的,这是一个好方法,因为现在您只有一个地方可以存储和保护所有第三方API密钥。这样做的好处是,您可以根据自己的喜好控制和限制使用它们。
使用此解决方案,您仍需要在移动应用中使用API密钥来允许访问您的API服务器,但是当攻击者继续容易受到攻击以窃取它时,您现在可以直接控制对API服务器和如果您在每次访问中确定 WHO 和 What 正在访问API服务器,那么您将拥有更精细的等级控制,但是攻击者仍将能够在我们所有的防御措施,因为很难知道什么正在访问API服务器。
您现在可能正在考虑...您是否愿意解释 WHO 与 What ?
为了更好地了解 WHO 和 What 在访问API服务器之间的区别,让我们使用以下图片:
预期的通信渠道表示合法用户没有任何恶意意图就可以使用您期望的移动应用程序,它使用的是未修改版本的移动应用程序,并且可以直接与API服务器通信,而不会受到中间人的攻击。
实际渠道可能代表几种不同的情况,例如具有恶意意图的合法用户可能正在使用移动应用程序的重新打包版本,黑客使用了移动应用程序的真实版本,而中间人则在进行攻击,了解移动应用程序与API服务器之间的通信是如何进行的,以便能够自动对您的API进行攻击。可能还有许多其他情况,但是我们在这里不逐一列举。
我希望到现在为止您可能已经知道为什么 WHO 和 What 不同的地方,但是如果不一样的话,一会儿就会明白。
WHO 是我们可以通过多种方式(例如使用OpenID Connect或OAUTH2流)进行身份验证,授权和标识的移动应用程序的用户。
通常,OAuth代表资源所有者向客户端提供对服务器资源的“安全委派访问”。它为资源所有者指定了一个在不共享凭据的情况下授权第三方访问其服务器资源的过程。 OAuth专为与超文本传输协议(HTTP)配合使用而设计,实质上允许在资源所有者的批准下,授权服务器将访问令牌发布给第三方客户端。然后,第三方使用访问令牌访问资源服务器托管的受保护资源。
OpenID Connect 1.0是OAuth 2.0协议之上的简单身份层。它允许客户端根据授权服务器执行的身份验证来验证最终用户的身份,并以可互操作且类似于REST的方式获取有关最终用户的基本配置文件信息。
尽管用户身份验证可能会让API服务器知道 WHO 正在使用API,但不能保证请求源自您期望的 What 。移动应用。
现在,我们需要一种方法来识别正在调用的API服务器,这使得事情变得比大多数开发人员想象的要棘手。 内容是向API服务器发出请求的内容。它是移动应用程序的真正实例,还是使用诸如Postman之类的工具通过API服务器手动访问的机器人,自动脚本或攻击者?
让您感到惊讶的是,您可能最终发现它可能是使用重新打包的移动应用程序版本或试图游戏化并利用该应用程序提供的服务的自动脚本的合法用户之一。
好吧,为了确定内容,开发人员倾向于求助于通常会在其移动应用程序代码中进行硬编码的API密钥。一些开发人员花了很多功夫,并在移动应用程序中在运行时计算密钥,因此与将静态机密嵌入代码中的前一种方法相反,它成为了运行时机密。
以上文章摘录自我写的一篇文章,题为《 为什么您的移动应用程序需要API密钥?”,因此您可以完整阅读here,即有关API密钥的系列文章中的第一篇。
现在,您知道 WHO 和 What 在访问API服务器之间的区别,您必须已经意识到API服务器仍然容易受到攻击者的攻击。< / p>
您现在可以诉诸于采用多个防御层,从reCaptcha V3开始,然后是Web Application Firewall(WAF),最后如果可以负担得起User Behavior Analytics(UBA)解决方案。
Google reCAPTCHA V3:
reCAPTCHA是一项免费服务,可保护您的网站免受垃圾邮件和滥用的侵害。 reCAPTCHA使用高级风险分析引擎和适应性挑战,以防止自动化软件参与您网站上的滥用行为。这样做是为了让您的有效用户轻松通过。
...可帮助您检测网站上的滥用流量,而不会引起用户的摩擦。它会根据与您网站的互动情况返回得分,并为您提供更大的灵活性以采取适当的措施。
WAF - Web Application Firewall:
Web应用程序防火墙(或WAF)过滤,监视和阻止与Web应用程序之间的HTTP通信。 WAF与常规防火墙的区别在于,WAF能够过滤特定Web应用程序的内容,而常规防火墙充当服务器之间的安全门。通过检查HTTP流量,它可以防止源自Web应用程序安全漏洞的攻击,例如SQL注入,跨站点脚本(XSS),文件包含和安全性错误配置。
UBA - User Behavior Analytics:
Gartner定义的用户行为分析(UBA)是一个有关检测内部威胁,针对性攻击和财务欺诈的网络安全流程。 UBA解决方案着眼于人类行为模式,然后应用算法和统计分析从这些模式中检测出有意义的异常,即表明潜在威胁的异常。 UBA不会跟踪设备或安全事件,而是跟踪系统的用户。像Apache Hadoop这样的大数据平台通过允许它们分析PB级的数据来检测内部威胁和高级持久威胁,正在增强UBA功能。
所有这些解决方案都基于否定性识别模型,换句话说,他们通过识别出什么是不好的而不是什么是好的来尽最大的努力将好与坏区别开来,因此尽管存在以下缺点,它们还是容易出现误报的情况其中一些人使用了先进的技术,例如机器学习和人工智能。
因此,您可能经常会发现自己不必放松放松如何阻止对API服务器的访问以不影响良好用户。这也意味着该解决方案需要进行持续监控,以验证误报不会阻止您的合法用户,同时又能正确阻止未经授权的用户。
关于为移动应用程序提供服务的API,可以通过使用移动应用程序证明解决方案来使用肯定的识别模型,该解决方案向API服务器保证可以信任请求,而不会产生误报。
使用移动应用证明解决方案,使API服务器能够知道仅接收到来自真正移动应用的请求。
移动应用程序证明服务的作用是在运行时通过在后台运行将与云中运行的服务进行通信的SDK来确保您的移动应用程序未被篡改或未在有根设备中运行证明移动应用程序和设备正在运行的完整性。
在成功证明移动应用程序完整性之后,将发布并使用一个秘密的短期生存JWT令牌进行签名,该秘密只有云中的API服务器和移动应用程序证明服务可以识别。如果移动应用程序证明失败,则会使用API服务器不知道的秘密对JWT令牌进行签名。
现在,应用程序必须随每个API一起发送,并在请求的标头中调用JWT令牌。这将允许API服务器仅在可以验证JWT令牌中的签名和到期时间时才处理请求,而在验证失败时拒绝它们。
一旦移动应用程序不知道移动应用程序证明服务使用的机密,即使在应用程序被篡改,在有根设备上运行或通过连接进行通信时,也无法在运行时对其进行反向工程成为中间攻击中一名男子的目标。
移动应用证明服务已经作为Approov的SAAS解决方案存在(我在这里工作),该服务为多个平台(包括iOS,Android,React Native等)提供SDK。集成还需要在API服务器代码中进行少量检查,以验证由云服务发出的JWT令牌。对于API服务器来说,必须进行此检查才能决定要处理的请求和拒绝的请求。
任何在客户端运行的,需要一些秘密才能访问API的内容都可能以不同的方式被滥用,并且您必须将对所有第三方API的访问权限委派给您所控制的后端,以便减少攻击面,并同时保护他们的秘密,以免被公众窥探。
最后,必须根据要保护的内容的价值以及此类数据的法律要求(例如欧洲的GDPR法规)来选择用于保护API服务器的解决方案。
答案 1 :(得分:0)
将它们存储在.env
这样的API_KEY=yourKey
文件中。
安装npm软件包react-native-dotenv。
然后根据需要使用react-native-dotenv包导入到文件;
import { API_KEY } from 'react-native-dotenv'
.env
文件绝对不能提交给Github。
答案 2 :(得分:0)
对于react native,请使用react-native-config库。使用此库时,您可以保护api密钥,也可以保存在本机代码中使用的更多秘密密钥。就像我们可以保存onesignal,codepush等键一样。