【问题标题】:Should the GCM API Key kept secret?GCM API 密钥是否应该保密?
【发布时间】:2016-07-08 01:04:56
【问题描述】:

根据documentation

请勿在客户端代码中的任何位置包含 API 密钥。

在我们当前的 Android 应用中就是这种情况——API 密钥没有包含在代码中。但是,对于 com.google.gms:google-services 库的新版本 3.0.0,如果没有它,它就会开始抛出错误 Missing api_key/current_key,如下所述:Missing api_key/current key with Google Services 3.0.0

此外,Google 的配置生成器 https://developers.google.com/mobile/add?platform=android&cntapi=gcmgoogle-services.json 文件中包含 API 密钥。

它应该保密吗?或者将其包含在客户端应用中是否安全?

【问题讨论】:

  • google-services.json 文件包含 GCM 的设置。包含发件人 id 和 api_key。您需要将其添加到模块以进行配置
  • 我认为标题应该是“GCM API 密钥是否应该保密”。
  • 我已经有几年没有接触过 GCM 了。过去有两个密钥:客户端密钥和发送者密钥。客户端密钥必须在应用程序中,最初在清单中的 <meta-data> 元素中。如果在注册过程中没有某些客户端密钥,我无法完全想象 GCM 将如何工作。因此,除非 Google 创造了一些奇迹,否则我会假设他们的文档有误,并且客户端 API 密钥应该在客户端应用程序中。
  • @CommonsWare 感谢您的评论。据我记得,情况正好相反。 SenderId 曾经在客户端应用程序中,用于生成设备令牌。服务器使用API_KEY 来识别GCM。检查GCM API key vs Sender ID。这就是为什么建议不要在客户端应用程序中包含 API 密钥的原因。然而,对于矛盾的陈述以及为什么他们现在需要包含它感到困惑?
  • 客户端密钥不需要保密,因为您在 Web 配置控制台上为任何给定密钥定义了所有允许的应用程序 ID。因此,即使有人获得了您的客户端密钥,他们也需要拥有您的应用程序 ID,除非您将签名密钥提供给他们,否则他们无法获得。因此,将您的签名密钥保密,一切都会好起来的。

标签: android google-cloud-messaging firebase-cloud-messaging


【解决方案1】:

google-services.json 文件代表 Firebase 中所有可用服务的配置。有些服务需要“Android”API 密钥。这些是您可以在 google-services.json 文件中找到的 API 密钥。您的应用可能使用也可能不使用这些 API 密钥,具体取决于您的应用使用的 Firebase API。

FCM 有一个用于发送消息的“服务器”API 密钥,此 API 密钥不是 google-services.json 文件中包含的密钥。服务器 API 密钥永远不应包含在您的应用程序中。然而,谷歌服务插件确实会在构建时查找那些 Android API 密钥,这可能是您出错的原因,这不是因为您的 FCM 服务器 API 密钥丢失。

【讨论】:

  • 感谢亚瑟的回答。它有很大帮助。这两个不一样是有道理的。
  • 同意这是对客户端密钥安全性不值得关注的原因的完整解释。
【解决方案2】:

回答我自己的问题。

如果我在 Firebase (https://console.firebase.google.com) 上创建一个新的测试项目,它还会将 API 密钥包含到

  • 用于 Android 应用的 google-services.json,
  • 适用于 iOS 应用的 GoogleService-Info.plist,
  • 对于 Web 应用程序,它甚至建议将 API 密钥包含到我的 HTML 中。

鉴于 HTML 绝对是公开的,我现在非常确信这不是秘密。

【讨论】:

    【解决方案3】:

    如果您使用 GCM,您的 Android 应用不需要知道 API 密钥。我只需要在 json 文件中为 api_key 包含一个空字段,GCM 即可工作。正如Missing api_key/current key with Google Services 3.0.0 and Maps API key in build.gradle 的答案中提到的那样,我只需要在google-services.json 中添加如下一行,GCM 就可以工作:

    "api_key": [
      {
          "current_key": ""
      }
    ],
    

    我认为您不应该包含 API 密钥,因为我认为只有您的服务器需要 API 密钥才能通过 Google 进行身份验证,以请求它向预期的接收者发送推送消息。如果有人抓住它,那将是一个风险。所以文件看起来像:

    {
      "project_info": {
        ...
      },
      "client": [
        {
          "client_info": {
             ...
          },
          "oauth_client": [
            {
              "client_id": "yourid.whatever.com",
              ...
            }
          ],
          "api_key": [
            {
              "current_key": ""
            }
          ],
          "services": {
           ...
          }
        }
      ],
      "configuration_version": "1"
    }
    

    希望这会有所帮助。

    【讨论】:

    • 但是如果您尝试使用 Google 的 developers.google.com/mobile/… 创建 google-services.json -- 它会将 API 密钥放入 google-services.json 文件中。与 Firebase 相同:console.firebase.google.com/?pli=1 我不相信他们不知道他们在做什么。您的解决方案可能有效,但由于它没有在任何地方记录,我认为使用它是不合适的——它可能随时停止工作。我想要一些更可信的答案(例如来自 Google 工程师)。
    • @DzmitryLazerka 如果您仍然假设 Google 的任何人都知道他们在做什么,那么您做 Android 开发人员的时间并不长。
    • 坦率地说,当我为 Firebase 生成 json 文件时,没有生成 api_key 字段的字段。如果我们能从 Google 的某个人那里得到答案,那就太好了。
    • 实际上,当我再次从 Firebase 下载 json 配置文件(如 this)时,它不会在我生成的 json 中包含 current_key
    • 有趣,我刚刚又试了一次,它确实包含 API Key。如果你点击“添加Web App”,它甚至建议你把它变成HTML,这绝对是公开的。
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多