【问题标题】:How to pass sensitive data to Google Cloud Endpoints from Android app?如何将敏感数据从 Android 应用程序传递到 Google Cloud Endpoints?
【发布时间】:2014-09-25 18:00:11
【问题描述】:

我正在尝试在 Google Endpoints 中创建一种简单的最小会话管理系统。

我在我的 Android 应用上对用户进行身份验证。为了进行经过身份验证的 Endpoint API 调用,我计划通过在第一次从 Android 应用程序调用 Endpoints API 时传递 idToken 在 Endpoint 服务器上验证用户一次。

然后,我会为该用户分配一个session_id(比如一个数字)。这个session_id 将被传回给那个安卓应用。 Cloud Endpoint 服务器在接下来的 24 小时内不会验证用户。

当 Android 应用程序使用该 session_id 调用端点 API 时,假设它来自经过身份验证的用户,我将执行所需的操作。

关注
如果有人嗅到session_id,他将能够执行经过身份验证的用户的操作。

问题 1 将敏感数据(如session_id)从 Android 应用程序传递到 Google Cloud Endpoints 是否安全(且方法正确)?

Q 2 即使我没有为我的网站启用 HTTPS,Android 应用程序和 Cloud Endpoints 之间的所有通信是否默认通过 HTTPS 完成? Official doc 说:

重要提示:Google Cloud Endpoints 需要 SSL。如果您需要访问 您在不支持 SSL 的系统中的后端 API,您需要 更新系统以支持 SSL 或使用代理。

另一个Official doc 说:

在两个方法装饰器中,我们提供了指定位置的路径 该方法服务于请求。指定的值附加到 API 路径,例如,如果指定了值 hellogreeting, 路径是 https://your-app-id.appspot.com/_ah/api/helloworld/v1/hellogreeting。 对于 greetings.getGreeting,路径是 hellogreeting/{id} 其中 {id} 是必需的,否则您的 API 方法将不会收到传入的请求 论据。

注意: 我没有为我的网站启用 SSL (HTTPS)。我在 web 和 Android/Java 上使用 GAE Python。我有一个网站和一个 Android 应用程序,我正在从 Google 身份验证迁移到基于 Google Identity Toolkit 的多个提供商身份验证(如 Facebook、Google 等)。

【问题讨论】:

    标签: android python google-app-engine google-cloud-endpoints


    【解决方案1】:

    第一季度。如果仅通过 HTTPS 传递,则可以假定它是安全的(来自嗅探),尽管我不确定它是否是正确的方式,这取决于您的实现。你提到这将是一个数字。什么样的号码?随机生成?顺序?

    另外,您使用的是用户 API / webapp2 吗?我喜欢内置的create_auth_token 功能,它可以节省您一些时间并在您的情况下替换session_id,然后您可以使用get_by_auth_tokenvalidate_token 获取相应的用户或简单地验证令牌和@987654327 @ 使令牌无效。

    如果您不使用用户 API / webapp2,最好不要使用随机数或序列号作为令牌,而是使用类似 token = HMAC('A_VERY_LONG_AND_SECRET_KEY', user_id + todays_date) 的东西,它是唯一的,有效期为 24 小时(从午夜开始,而不是自创建以来时间),并且只要密钥是秘密的,它就是秘密的,这是一个更好、更安全的选择。

    第二季度。即使您的自定义域没有 SSL 证书,您的 APPID.appspot.com 也有(尝试通过 httpS:// 访问您的项目,您会看到)。

    Cloud Endpoints 始终通过 SSL 提供 API(实际上无法更改)。

    Google 向您发出的警告是关于客户端不支持 SSL 连接的可能情况,这种情况在现实世界中不会经常发生。

    【讨论】:

    • 感谢您的回复。我不确定这是否是一个坏主意,但如果 Android 和可能端点之间的通信是 HTTPS,我正在考虑使用 sequential numbers。如果不是,那么无论我使用什么,安全性都非常低。 https: //mydomain.appspot.com 是 HTTPS,您是对的。但我不知道where to provide this HTTPS URL in Android app or Could Endpoint so that this URL is used for all communication。我怀疑 Endpoints 可能仅在基于 Google 帐户的身份验证期间使用此 URL,但不确定。
    • 另外,我现在无法使用用户 API,因为我正在迁移到基于 Google 身份工具包的身份验证。
    • 连续数字可能不是一个好主意,原因有两个:1) 即使您在任何地方使用 HTTPS,您的 token / session_id 也不会被嗅探,但最终用户仍然可以找到它是什么,最终弄清楚增加它会打开对下一个用户数据的访问。 2)在 NDB 中实现顺序 ID 并不容易。另外,请查看我关于 Endpoints/SSL 的 Q2 更新。
    • 非常感谢您提供所有 Endpoint 到 Android 应用程序通信始终是 HTTPS 的信息。我想我现在可以放心地假设我的 Android 应用程序和 Cloud Endpoint 服务器之间交换的数据不会被任何人嗅探。根据您的建议,我会尝试对 session_id 使用随机数而不是顺序数。
    • 我不建议您使用随机数... :) 除非它是真正随机的 64 位 int(python2.7 中的 long),否则这也不是最好的方法(它如果您有很多用户,仍然可能会被暴力破解,但它比使用序列号要好一些)。我在上面的答案中添加了另一个更新,我认为这是一个更好的解决方案。 HMAC 建议的另一个好处是,您根本不必将生成的令牌存储在服务器端,只需验证传入的请求,因为同一用户在整个 24小时。
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2012-05-16
    • 2020-11-10
    • 2011-06-11
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多