Rest 移动应用程序/API安全:硬编码的访问密钥就足够了吗?

Rest 移动应用程序/API安全:硬编码的访问密钥就足够了吗?,rest,api,security,mobile,jwt,Rest,Api,Security,Mobile,Jwt,我正在开发一个移动应用程序,允许用户在其位置附近查找商店和折扣。移动应用程序通过RESTAPI从服务器获取信息,我显然想保护该API 将一个128位的访问密钥硬编码到移动应用程序中,并在每个强制使用https的请求中发送它,然后检查它是否与服务器密钥匹配,这样就足够了吗?我知道JWT,但我相信使用它或其他基于令牌的方法会给我带来更多的灵活性,但不一定会带来更多的安全性 就我所知,这种方法的唯一问题是我容易受到团队中恶意开发人员的攻击。有没有办法解决这个问题 首先,正如在这里多次讨论的那样,您想要

我正在开发一个移动应用程序,允许用户在其位置附近查找商店和折扣。移动应用程序通过RESTAPI从服务器获取信息,我显然想保护该API

将一个128位的访问密钥硬编码到移动应用程序中,并在每个强制使用https的请求中发送它,然后检查它是否与服务器密钥匹配,这样就足够了吗?我知道JWT,但我相信使用它或其他基于令牌的方法会给我带来更多的灵活性,但不一定会带来更多的安全性

就我所知,这种方法的唯一问题是我容易受到团队中恶意开发人员的攻击。有没有办法解决这个问题


首先,正如在这里多次讨论的那样,您想要实现的目标在技术上是不可能的,可以称之为安全的。您不能对客户端进行身份验证,只能对用户进行身份验证。原因是,您输入到客户机中的任何内容都将对使用它的用户完全可用,因此他们可以复制它发出的任何请求

下面的任何内容都只是一个思想实验

您添加静态密钥并随每个请求一起发送的方法是一种非常幼稚的尝试。作为一名攻击者,我只要检查一下你的应用程序创建的一个请求就足够了,然后我就拥有了发出任何其他请求的密钥

一个稍微好一点的方法是在应用程序中存储一个密钥并用它对请求进行签名,而不是发送实际的密钥,例如,使用该密钥创建请求的hmac,并将其添加为额外的请求头。这更好,因为我必须拆开应用程序才能拿到钥匙——更多的工作可能会让我望而却步,但很有可能

作为下一步,该密钥可以在首次使用您的应用程序时生成,我们正在接近这一点。用户安装应用程序,生成密钥,将其存储在平台的相应密钥库中,然后向用户注册。从那时起,在您的后端上,您需要对每个请求进行签名,例如上面的hmac方法以及与您的用户关联的密钥。显而易见的问题是如何分配密钥——这样的密钥仍然可以验证用户,而不是他的设备或客户端,但至少可以从移动平台上的适当密钥库进行验证,在没有根/越狱的情况下获取密钥是不容易的。但没有任何东西可以阻止攻击者在根设备或模拟器上安装应用程序

所以底线是,您不能阻止人们使用不同的客户端访问您的api。然而,在绝大多数情况下,他们无论如何都不想这样做。如果你真的想保护它,它不应该是公开的,而且移动应用程序不是合适的平台。

你的问题 将一个128位的访问密钥硬编码到移动应用程序中,并在每个强制使用https的请求中发送它,然后检查它是否与服务器密钥匹配,这样就足够了吗

不,因为你在移动应用程序中隐藏的每一个秘密都不再是秘密,因为每个想花时间对你的移动应用程序进行反向工程或在他控制的设备中对其执行MitM攻击的人都可以访问

在这篇文章中,我展示了从二进制文件中提取秘密是多么容易,但我也展示了一种隐藏秘密的好方法,这使得逆向工程变得非常困难:

是时候寻找一种更先进的技术来隐藏API密钥,这将很难从APK反向工程,因此,我们将利用本机C++代码来存储API密钥,利用在NUK下使用NDK的JNI接口。 虽然秘密可能很难反向工程,但通过MitM攻击很容易提取,这就是我在文章中所说的:

因此,在本文中,您将学习如何设置和运行MitM攻击,以拦截您控制的移动设备中的https流量,从而可以窃取API密钥。最后,您将从较高的层次了解如何减轻MitM攻击

如果您阅读了这篇文章,您将了解攻击者将如何提取您通过https传输到API服务器的任何秘密,因此您团队中的恶意开发人员将不是您唯一关心的问题

您可以去学习如何实现证书固定来保护您与API服务器的https连接,我也写了一篇关于它的文章,题目是:

在本文中,您了解到证书固定是将域名与其预期的X.509证书相关联的行为,这对于保护证书链中基于信任的假设是必要的。错误颁发或泄露的证书是一种威胁,而且还必须保护移动应用程序,防止其在恶意环境(如公共WIFI)中使用,或防止DNS劫持攻击

最后,您学习了如何使用imple防止MitM攻击 在Android应用程序中重新安装证书固定,该应用程序使用现代Android设备的网络安全配置文件,然后使用TrustKit软件包,该软件包支持现代和旧设备的证书固定

抱歉,但我需要通知您,在攻击者控制的设备中可以绕过证书固定,我将在题为:

在本文中,您将学习如何重新打包移动应用程序,以使其信任自定义ssl证书。这将允许我们绕过证书固定

尽管可以绕过证书固定,但始终使用它来保护移动应用程序和API服务器之间的连接是很重要的

那么现在呢,我是否注定要在维护我的API服务器时失败。。。希望依然存在,继续阅读

保护API服务器 移动应用程序通过RESTAPI从服务器获取信息,我显然想保护该API

保护移动应用程序的API服务器是可能的,并且可以通过使用移动应用程序认证概念来实现

在我详细解释移动应用程序认证概念之前,我们首先要澄清开发人员之间的一个常见误解,即访问API服务器的用户和用户之间的区别

访问API服务器的用户和用户之间的差异 为了更好地理解访问API服务器的用户和用户之间的区别,让我们使用以下图片:

预期的通信通道代表移动应用程序,正如你所预期的,由合法用户使用,没有恶意的意图,使用未篡改的移动应用程序版本,直接与API服务器通信而不受中间人攻击。

实际频道可能代表几种不同的场景,比如一个恶意用户,可能使用一个重新打包的移动应用程序版本,一个使用移动应用程序的真正版本的黑客,而中间人攻击它。了解移动应用程序与API服务器之间的通信方式,以便能够自动攻击您的API。许多其他场景都是可能的,但我们在这里不一一列举

我希望到现在为止,你们可能已经知道为什么谁和什么不一样了,但如果不一样的话,很快就会弄清楚

WHO是移动应用程序的用户,我们可以通过多种方式对其进行身份验证、授权和识别,比如使用OpenID Connect或OAUTH2流

通常,OAuth代表资源所有者向客户端提供对服务器资源的安全委托访问。它为资源所有者指定一个过程,以授权第三方访问其服务器资源,而不共享其凭据。OAuth专门设计用于超文本传输协议HTTP,本质上允许授权服务器在资源所有者的批准下向第三方客户机颁发访问令牌。然后,第三方使用访问令牌访问由资源服务器承载的受保护资源

OpenID Connect 1.0是OAuth 2.0协议之上的一个简单标识层。它允许客户端基于授权服务器执行的身份验证来验证最终用户的身份,并以可互操作和类似REST的方式获取有关最终用户的基本配置文件信息

虽然用户身份验证可以让API服务器知道谁在使用API,但它不能保证请求来自您所期望的移动应用程序的原始版本

现在我们需要一种方法来确定调用API服务器的是什么,这里的事情比大多数开发人员想象的要复杂得多。向API服务器发出请求的对象是什么。它真的是一个真正的移动应用程序实例,还是一个机器人、一个自动脚本或一个攻击者使用Postman之类的工具手动拨弄API服务器

出乎意料的是,你最终可能会发现,它可能是一个合法用户,正在使用重新打包的移动应用程序版本,或者是一个试图游戏化并利用该应用程序提供的服务的自动脚本

好吧,为了确定是什么,开发人员倾向于求助于API密钥,通常他们会在移动应用程序的代码中硬编码。一些开发人员在移动应用程序的运行时花费了额外的精力来计算密钥,因此它成为了运行时的秘密,而不是在代码中嵌入静态秘密时的前一种方法

上面的文章摘自我写的一篇文章,题为《为什么你的移动应用程序需要API密钥?》,你可以阅读全文,这是关于API密钥系列文章的第一篇文章

移动应用认证 移动应用认证解决方案的作用是在运行时保证您的移动应用未被篡改、未运行 在一个根设备中,不会被像xPosed或Frida这样的框架检测,不会受到MitM攻击,这是通过在后台运行SDK实现的。云计算中运行的服务将挑战应用程序,并根据响应证明移动应用程序和设备运行的完整性,因此SDK永远不会对任何决策负责

将您自己的脚本注入黑盒进程。钩住任何函数,监视加密API或跟踪私有应用程序代码,无需源代码。编辑,点击保存,并立即查看结果。所有这些都没有编译步骤或程序重新启动

Xposed是一个模块框架,可以在不接触任何apk的情况下更改系统和应用程序的行为。这很好,因为这意味着只要原始代码没有太多更改,模块就可以在不同版本甚至ROM上工作,而无需任何更改。它也很容易撤销

为渗透测试人员和软件开发人员提供的一种交互式TLS,能够拦截HTTP代理

在成功认证移动应用完整性后,将发布一个短时间有效的JWT令牌,并使用一个只有API服务器和云中的移动应用认证服务知道的秘密进行签名。在移动应用程序认证失败的情况下,JWT令牌使用API服务器不知道的秘密进行签名

现在,应用程序必须随每个API调用一起发送请求头中的JWT令牌。这将允许API服务器仅在能够验证JWT令牌中的签名和过期时间时服务请求,并在验证失败时拒绝它们

一旦移动应用程序认证服务所使用的秘密不被移动应用程序所知,即使在应用程序被篡改、在有根设备中运行或通过连接成为中间人攻击目标的连接时,也不可能在运行时逆向设计它。 移动应用认证服务已经作为SAAS解决方案存在于Approvi work中,它为多个平台提供SDK,包括iOS、Android、React Native和其他平台。集成还需要在API服务器代码中进行一次小检查,以验证云服务发布的JWT令牌。此检查对于API服务器能够决定服务哪些请求以及拒绝哪些请求是必需的

总结 最后,为保护您的API服务器而使用的解决方案必须根据您试图保护的内容的价值和该类型数据的法律要求来选择,如欧洲的GDPR法规

你想多跑一英里吗? OWASP移动安全项目是一个集中的资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类,并提供开发控制,以减少其影响或被利用的可能性


如果它是在应用程序中硬编码的,那么肯定有人可以检索该密钥并将其用于自己的目的。无论是通过查看您提到的开发人员的直接源代码还是反编译源代码,您都已将对该密钥的访问权交给了拥有该应用程序的每个人。@Michael,那么您有什么建议?我真的认为这是不可能的。。。更多安全性:查看oAuth中带有PKCE扩展的授权授予流。医生是个好的开始,描述得很好。有一个问题:你能像你说的那样检查我的请求吗,即使我使用HTTPS?否则,我的方法的安全性不会低于其他方法。如果我控制客户机,并且我在这种情况下控制客户机,当然可以。