为什么 Youtube 或任何其他 Google 服务在 url 中使用帐户绑定授权密钥?

信息安全 中间人 谷歌 api 逆向工程
2021-08-21 05:52:01

过去,我使用 Google 可用的 api 工具过期,例如 Drive 和 Youtube api。

它的工作方式是在您购买开发者帐户后,您将通过 api 获得许多 Google 服务,为了使用这些服务,您需要一个与您的帐户相关联并附加到每个请求 url 的 uniuqe api 密钥.

例如:

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=some.playlist.id&key={YOUR_API_KEY}

一开始我认为使用 key -> account 绑定是一个聪明的主意,例如,如果 api 密钥绕过 tos,Google 可以简单地禁止该帐户。

但后来我发现使用 MITM 工具(如 Mitmproxy)很容易对 Android/iOS 应用程序中的授权密钥进行逆向工程。使用这种方法,我设法找到了Youtube 官方应用程序 api key,以及许多其他使用这些服务的应用程序,所以我的问题是,谷歌不是这样使用自动化密钥的吗?因为应用程序仍然可以使用其服务保持匿名,甚至可以伪装成其他帐户!.

构建将接收帐户密钥并使用它在本地为每个请求生成一次性密钥的 sdk 不是更好的主意吗?当然,这也可以进行逆向工程,但难度会大得多……

3个回答

如果您使用的是高级计划,您可以获得一个 Google ClientID,它带有您自己的私钥。

注册 Google Maps APIs 高级计划后,您将通过您提供的联系电子邮件地址收到一封来自 Google 的欢迎信。欢迎信包含以下重要信息,因此请确保将其放在手边:

  • 项目编号
  • 客户编号
  • 您的客户端 ID 的私有加密密钥
  • 谷歌帐户

身份验证和授权

要向我们的 API 发出请求,您必须使用 API 密钥或客户端 ID 对您的应用程序进行身份验证。此外,对某些 API 的请求还需要数字签名。

但你必须是溢价:)

来自https://developers.google.com/youtube/registering_an_application

API 支持 API 密钥和 OAuth 2.0 凭据。创建适合您项目的凭据:

  1. OAuth 2.0:您的应用程序必须将 OAuth 2.0 令牌与访问私人用户数据的任何请求一起发送。您的应用程序会发送一个客户端 ID,并且可能还会发送一个客户端密码来获取令牌。您可以为 Web 应用程序、服务帐户或已安装的应用程序生成 OAuth 2.0 凭据。有关详细信息,请参阅创建 OAuth 2.0 凭据部分。

  2. API 密钥:不提供 OAuth 2.0 令牌的请求必须发送 API 密钥。密钥标识您的项目并提供 API 访问、配额和报告。有关创建 API 密钥的信息,请参阅创建 API 密钥部分

您看到的是 OAuth 2.0 密钥,它与个人用户的帐户绑定,可用于访问私人用户数据;或 API 密钥,不能用于访问私人用户数据,而只能用于配额/速率限制和报告。

此外,还有四种类型的 API 密钥:

  • 服务器密钥:您在服务器上使用它,您不会将此密钥与您的应用程序一起分发
  • 浏览器密钥:Google 会根据 Referer/Origin 标头验证此类令牌的使用情况
  • iOS 密钥和 Android 密钥:Google 会根据应用程序标识符验证此类令牌的使用情况

MITMing OAuth 2.0 密钥只能让您访问自己的数据,因此它并不是真正有用,而 MITMing API 密钥不会让您访问用户的数据,所以它也不是很有用。MITMing API 密钥唯一能做的就是通过最大化密钥配额或扭曲应用程序的使用报告来有针对性地中断应用程序。当然,这些都是问题,但如果您的应用程序直接在客户端调用 YouTube API,这不是可以避免的。

应用程序应该和网络应用程序有同样的问题,在网络应用程序上,我们使用“代理”来解决这个问题。你有一个服务器,通常是 php,它有你的 API 密钥,并在客户端点击服务器脚本时使用该密钥向谷歌发出请求。

API 的响应被记录、编辑并传递给请求的客户端。您的客户永远不会看到 API 密钥,并且您有更多的日志条目涵盖了您的应用程序的使用情况。它还可以帮助您在不重新键入的情况下禁止某些用户,甚至可以切换后端提供商,同时从客户的角度保持统一的响应。