我正在为移动应用程序 (Cordova) 开发 Web 服务 (PHP),该 Web 服务提供了一些 REST API。
当前场景:API 本身没有身份验证,任何拥有端点的人都可以发出请求,但在应用程序层,所有操作都需要经过身份验证的用户(用户登录并接收 JWT),这已经实现。
问题:我想保护 REST API 仅供授权客户端使用(API KEY?)。
我应该实现类似的东西:公钥和秘密(hmac)?
我走错了路,我应该使用类似 oauth (* 这是一个私有 API *) 的东西。
听起来除了用户之外,您还想对 Cordova 应用程序二进制文件进行身份验证,以确保向 PHP 服务器发出的 REST API 请求来自合法来源,而不是例如可能最终通过以下方式抓取后端数据的流氓应用程序或脚本逆向工程 API。
OAuth/OpenID 流通常用于对用户进行身份验证,而不是对移动应用程序等软件进行身份验证,重要的是要记住,真正经过身份验证的用户仍然可以利用虚假软件来利用 REST API。
您有两个选择:
使用 HMAC 对来自移动应用程序的 API 请求进行签名当然是一个好主意,但回想一下 HMAC 函数将秘密和消息作为参数,并且秘密最终必须在内存中以单一形式(即使最初被混淆)并且可能是如果使用无法混淆的内置 HMAC 系统版本,则从移动应用程序中提取。
我强烈建议不要在移动应用程序中嵌入秘密——一旦应用程序在各种商店公开可用,移动应用程序使用的秘密和 API 就可以通过逆向工程的过程获得。
如果您决定在您的应用程序中使用 HMAC 请求签名方法,那么您绝对应该实现:
同时,在消息中编码以允许 REST API 被告知,以便它可以做出保护自己的决定。此外,在本机代码中执行任何这些 - 而不是在 Cordova Javascript 代码中,因为该层和 JS/本机桥接层在移动应用程序中引入了一个弱点。
您提到了“公钥”,但在非对称加密(例如 RSA)中,该密钥通常用于加密和验证操作。私钥用于解密和签名操作,因此它是您在应用程序中需要的私钥。我永远不会提前嵌入这个。
您还可以在 HMAC 消息中包含应用程序的开发人员签名权限,这有助于防止其他人签名的重新打包版本。
带内 HMAC API 请求签名的另一种方法是使用带外标记化方法,该方法使用JWT来表达移动应用程序的有效性。您可以在远程软件身份验证服务器上定期执行移动应用程序有效性测试,向移动应用程序提供 JWT,该 JWT 可以包含在每个 REST API 请求中。例如,这是Approov所做的事情。
不要将应用程序强化(混淆、字符串加密等)与 REST API保护混淆也非常重要:在前一种情况下,您会在移动应用程序中看到价值;在后一种情况下,您会看到REST API 背后的数据中的值。
这是一个很难有效解决的问题,除非你有足够的资源,所以我建议使用其他人已经解决了这些问题的解决方案,这样你就可以将精力集中在应用程序功能、用户体验和上市时间上。
无论您做出什么决定,对于积极主动的安全性 +1,我希望这会有所帮助,并祝项目好运!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句