Rest API:客户端授权和最终用户身份验证

尤利乌斯

我正在为移动应用程序 (Cordova) 开发 Web 服务 (PHP),该 Web 服务提供了一些 REST API。

当前场景:API 本身没有身份验证,任何拥有端点的人都可以发出请求,但在应用程序层,所有操作都需要经过身份验证的用户(用户登录并接收 JWT),这已经实现。

问题:我想保护 REST API 仅供授权客户端使用(API KEY?)。

  1. 我应该实现类似的东西:公钥和秘密(hmac)?

  2. 我走错了路,我应该使用类似 oauth (* 这是一个私有 API *) 的东西。

西蒙·里格

听起来除了用户之外您还想对 Cordova 应用程序二进制文件进行身份验证,以确保向 PHP 服务器发出的 REST API 请求来自合法来源,而不是例如可能最终通过以下方式抓取后端数据的流氓应用程序或脚本逆向工程 API。

OAuth/OpenID 流通常用于对用户进行身份验证,而不是对移动应用程序等软件进行身份验证,重要的是要记住,真正经过身份验证的用户仍然可以利用虚假软件来利用 REST API。

您有两个选择:

  1. 自己动手
  2. 购买现成的解决方案

使用 HMAC 对来自移动应用程序的 API 请求进行签名当然是一个好主意,但回想一下 HMAC 函数将秘密和消息作为参数,并且秘密最终必须在内存中以单一形式(即使最初被混淆)并且可能是如果使用无法混淆的内置 HMAC 系统版本,则从移动应用程序中提取。

我强烈建议不要在移动应用程序中嵌入秘密——一旦应用程序在各种商店公开可用,移动应用程序使用的秘密和 API 就可以通过逆向工程的过程获得。

如果您决定在您的应用程序中使用 HMAC 请求签名方法,那么您绝对应该实现:

  1. 调试检测
  2. 根/越狱检测
  3. 检测框架检测(例如Frida),以及
  4. 中间人网络代理检测

同时,在消息中编码以允许 REST API 被告知,以便它可以做出保护自己的决定。此外,在本机代码中执行任何这些 - 而不是在 Cordova Javascript 代码中,因为该层和 JS/本机桥接层在移动应用程序中引入了一个弱点。

您提到了“公钥”,但在非对称加密(例如 RSA)中,该密钥通常用于加密和验证操作。私钥用于解密和签名操作,因此它是您在应用程序中需要私钥永远不会提前嵌入这个。

您还可以在 HMAC 消息中包含应用程序的开发人员签名权限,这有助于防止其他人签名的重新打包版本。

带内 HMAC API 请求签名的另一种方法是使用带外标记化方法,该方法使用JWT来表达移动应用程序的有效性。您可以在远程软件身份验证服务器上定期执行移动应用程序有效性测试,向移动应用程序提供 JWT,该 JWT 可以包含在每个 REST API 请求中。例如,这是Approov所做的事情

不要将应用程序强化(混淆、字符串加密等)与 REST API保护混淆也非常重要:在前一种情况下,您会在移动应用程序中看到价值;在后一种情况下,您会看到REST API 背后的数据中的值

这是一个很难有效解决的问题,除非你有足够的资源,所以我建议使用其他人已经解决了这些问题的解决方案,这样你就可以将精力集中在应用程序功能、用户体验和上市时间上。

无论您做出什么决定,对于积极主动的安全性 +1,我希望这会有所帮助,并祝项目好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

玩!适用于Android客户端的Framework 2 REST身份验证和授权

来自分类Dev

Jhipster + REST客户端+身份验证

来自分类Dev

在客户端进行身份验证,如何现在保护我的Java Rest API?

来自分类Dev

EnergyStar Portfolio Manager-Java客户端使用带身份验证的REST API

来自分类Dev

在客户端进行身份验证,如何现在保护我的Java Rest API?

来自分类Dev

Jboss EAP 7 - REST API 客户端的动态 SSL 身份验证

来自分类Dev

用户和应用程序的REST API身份验证

来自分类Dev

在需要客户端证书进行身份验证的Node.js中进行REST调用

来自分类Dev

在需要客户端证书进行身份验证的Node.js中进行REST调用

来自分类Dev

neo4j REST API身份验证和授权

来自分类Dev

为什么我的REST服务.NET客户端发送不带身份验证标头的每个请求,然后使用身份验证标头重试?

来自分类Dev

在 REST 节点 js 服务器中进行身份验证,使用带有 Facebook 登录的 Android 客户端

来自分类Dev

如何使用客户端证书在Web API中进行身份验证和授权

来自分类Dev

如何向最终用户隐藏REST API网址?

来自分类Dev

从JIRA REST API获取当前经过身份验证的用户

来自分类Dev

REST API上的用户注册/身份验证流程

来自分类Dev

在REST API中,为多个用户处理身份验证

来自分类Dev

REST api项目的用户身份验证方法

来自分类Dev

WP REST API - 无需身份验证的用户注册

来自分类Dev

Web 客户端 API 和 Rest API

来自分类Dev

REST API和用户授权

来自分类Dev

REST API用于内部使用和身份验证

来自分类Dev

Web api 2客户端和用户两部分身份验证

来自分类Dev

使用Javascript客户端进行REST基本身份验证的安全性缺点(如果有)是什么?

来自分类Dev

REST客户端和外来字符

来自分类Dev

Java REST API客户端

来自分类Dev

Java REST API客户端

来自分类Dev

REST API上的CakePHP身份验证

来自分类Dev

如何-AWS Rest API身份验证

Related 相关文章

  1. 1

    玩!适用于Android客户端的Framework 2 REST身份验证和授权

  2. 2

    Jhipster + REST客户端+身份验证

  3. 3

    在客户端进行身份验证,如何现在保护我的Java Rest API?

  4. 4

    EnergyStar Portfolio Manager-Java客户端使用带身份验证的REST API

  5. 5

    在客户端进行身份验证,如何现在保护我的Java Rest API?

  6. 6

    Jboss EAP 7 - REST API 客户端的动态 SSL 身份验证

  7. 7

    用户和应用程序的REST API身份验证

  8. 8

    在需要客户端证书进行身份验证的Node.js中进行REST调用

  9. 9

    在需要客户端证书进行身份验证的Node.js中进行REST调用

  10. 10

    neo4j REST API身份验证和授权

  11. 11

    为什么我的REST服务.NET客户端发送不带身份验证标头的每个请求,然后使用身份验证标头重试?

  12. 12

    在 REST 节点 js 服务器中进行身份验证,使用带有 Facebook 登录的 Android 客户端

  13. 13

    如何使用客户端证书在Web API中进行身份验证和授权

  14. 14

    如何向最终用户隐藏REST API网址?

  15. 15

    从JIRA REST API获取当前经过身份验证的用户

  16. 16

    REST API上的用户注册/身份验证流程

  17. 17

    在REST API中,为多个用户处理身份验证

  18. 18

    REST api项目的用户身份验证方法

  19. 19

    WP REST API - 无需身份验证的用户注册

  20. 20

    Web 客户端 API 和 Rest API

  21. 21

    REST API和用户授权

  22. 22

    REST API用于内部使用和身份验证

  23. 23

    Web api 2客户端和用户两部分身份验证

  24. 24

    使用Javascript客户端进行REST基本身份验证的安全性缺点(如果有)是什么?

  25. 25

    REST客户端和外来字符

  26. 26

    Java REST API客户端

  27. 27

    Java REST API客户端

  28. 28

    REST API上的CakePHP身份验证

  29. 29

    如何-AWS Rest API身份验证

热门标签

归档