使用 WSO2 作为移动应用程序的 API 网关时,如何安全地处理用户密钥和秘密

Posted

技术标签:

【中文标题】使用 WSO2 作为移动应用程序的 API 网关时,如何安全地处理用户密钥和秘密【英文标题】:When using WSO2 as API gateway for mobile app, how to handle comsumer-key and secret securely 【发布时间】:2020-04-15 22:33:29 【问题描述】:

我们正在构建一个移动应用程序及其 API 服务器,其架构如下图所示。

我们将 WSO2 作为 Spring Boot API Server 前面的 API 网关。我们使用 WSO2 API Manager 来限制谁可以调用 API。只有在我们的 WSO2 注册并拥有正确消费者密钥和秘密的客户端才能通过 WSO2 调用 API,通过该 API,客户端首先调用 WSO2 的令牌端点以使用访问令牌交换消费者密钥和秘密,然后调用所需的 API使用标头Authorization: Bearer <access token>中的访问令牌

我们有一个问题,我们不知道如何为消费者保密,因为安全审计禁止我们将秘密存储在移动应用安装程序包中。

有些问题已经问过了,例如

WSO2 API Manager - How does mobile app connect to API Manager?

WSO2 Api Manager OAuth2 DCR security in public native mobile app

但没有答案能正确指出问题所在。他们中的大多数人被 oauth2 流程的复杂性误导了。

为使问题具体明确,请假设我们的手机没有用户登录。此问题的目标是只允许受信任的移动应用程序通过 WSO2 调用 API。

请帮助建议这是否可能。或者我们别无选择,只能允许任何人调用 API。还是 WSO2 的消费者订阅功能根本不适合直接从移动应用程序使用?

【问题讨论】:

简短的回答是你不能。您可以混淆令牌/密钥以使攻击者更难攻击,但本质上您无法信任该设备,因为您无法对其进行物理控制。 【参考方案1】:

在做了一些研究后,我发现了人们通常会做的 2 个选项。

    将 API 分成 2 组。第一组包含无需用户登录即可使用的 API,例如获取初始化数据或获取应用程序登录页面数据的 API。这些 API 设置为公开的,允许任何人在没有 clientId 和 secret 的情况下调用。 seconds 组包含需要令牌的安全 API。移动应用可以使用 Oauth2 PKCE 流来交换令牌和用户身份证明。

    混淆 clientId 和 secret 并将它们保存在移动应用安装程序包中。 API 仍然像以前一样分为 2 组。但第一组需要客户端级令牌(oauth2 客户端凭证类型),第二组需要用户级令牌(资源所有者密码或授权码类型)

我更喜欢选项 2。在我看来,我认为第一个选项没有任何意义。选择这个选项的人,也许只是为了绕过安全审计检查列表,to not store the secret in public client,而不真正关心安全问题。就像你不能相信你的孩子会安全地保管你家的钥匙,所以你决定从门上取下锁。

保护每个 API 并将密钥保存在客户端中。尽管有些黑客可以设法找到秘密,但他只能破解第一组的 API,您可以跟踪他使用的 clientId。您知道客户端的预期行为,因此很容易设置警报以检测来自客户端的恶意活动并撤销令牌、重置密码并推出更复杂的混淆算法。

【讨论】:

【参考方案2】:

您可能想阅读OAuth 2.0 for Native Apps [RFC7636] 规范。它指出:

公共原生应用客户端必须实现代码证明密钥 Exchange (PKCE [RFC7636]) 对 OAuth 的扩展和授权 服务器必须支持此类客户端的 PKCE,原因详述 在第 8.1 节中。

也请检查以下答案。

How to implement Oauth2 without sending client_secret in WSO2 APIM

【讨论】:

谢谢,但是 PKCE 需要用户登录才能换取令牌。

以上是关于使用 WSO2 作为移动应用程序的 API 网关时,如何安全地处理用户密钥和秘密的主要内容,如果未能解决你的问题,请参考以下文章

WSO2 Api Manager公共本地移动应用中的OAuth2 DCR安全性

使用 WSO2-AM 处理 JWT

WSO2 API Manager 拒绝设置不安全的标头“Cookie”

用于事件驱动架构的 API 网关

使用 REST 客户端 POSTMAN 使用 api 密钥调用 AWS api 网关端点

将 WSO2API 管理器从 H2 迁移到 Mysql