【问题标题】:Securing a 3rd party Secret in Android在 Android 中保护第 3 方机密
【发布时间】:2015-02-15 02:03:15
【问题描述】:

我有一个名为Bashoto 的用于构建实时本地应用程序的平台,我将构建一个Android 客户端。

Bashoto 应用程序可以选择进行身份验证,这是通过生成一次性使用、过期 JSON Web Token(简称 JWT)以及应用程序令牌和验证令牌有效的签名来完成的。每个连接都会有一个唯一的 JWT,它是通过使用 Secret 对内容进行签名而生成的。

在 Web 环境中,这意味着客户端后端拥有 Secret 的副本,对令牌进行签名并将其传递给客户端前端,然后在对 BashotoIO 服务器的请求中使用。

在移动环境中,在本例中是 Android,存在的问题是在应用程序代码本身中保留该 Secret 是一个潜在的攻击媒介,因为有人可以检查 APK 来找到它。

在 Android 应用程序中真正保持 Secret 秘密的最佳方式是什么,同时仍然保持 Bashoto 集成的简单和精简?

我希望用法看起来像这样

Bashoto bashoto = Bashoto.fromAppKey("my-app-key");
bashoto.locate();
BashotoTopic topic = bashoto.topic("my-topic-name"); //token signing and connection happens here
topic.send("Some message that only gets seen by nearby people");

【问题讨论】:

  • 有一个简单的规则。如果您真的希望它保密,请不要将其放在设备上。无论您做什么,您的代码都必须能够找到秘密,这意味着黑客也可以找到它。你唯一能做的就是减慢它们的速度。

标签: android api security mobile jwt


【解决方案1】:

这取决于您希望密钥的安全性。您可以使用 proguard http://responsiveandroid.com/2014/12/10/android-proguard-tutorial.html 混淆您的代码。这仍然会有字符串文字,但会更难通过反编译但并非不可能。

如果这不够安全,那么您不能将其保存在 APK 中,您必须将其保存在远程服务器上。理想情况下,该服务器将使用 SSL 来保持流量的私密性。如果您没有密钥,您可以获取密钥并使用 android 密钥库 https://developer.android.com/training/articles/keystore.html 在本地安全地存储它。这意味着用户将无法反编译您的应用程序并找到密钥。

如果您担心 SSL 很糟糕,那么您需要转向 SSL pinning,这将验证任何服务器的真实性。 https://developer.android.com/training/articles/security-ssl.html#Pinning

【讨论】:

  • 这实际上与我已经使用的 Web 身份验证框架非常匹配。 1) 仅保留 Android 客户端上的 AppKey,并清楚如果有人尝试访问该密钥,则可以访问该密钥。 2) 使用身份验证的应用程序必须从自己的服务器获取 JWT,该 JWT 将传递给 BashotoIO 服务器。
猜你喜欢
  • 2014-02-18
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多