我有一个用于构建名为Bashoto的实时本地应用程序的平台,我将构建一个Android客户端。
Bashoto应用程序可以选择进行身份验证,这是通过生成一次性使用,使用应用程序令牌到达JSON Web Token(简称JWT)和签名来验证令牌是否有效来完成的。每个连接都有一个唯一的JWT,通过使用Secret签名内容生成。
在Web环境中,这意味着客户端后端具有Secret的副本,对令牌进行签名并将其传递到客户端前端,然后将其用于对BashotoIO服务器的请求。
移动环境(在这种情况下是Android)中的问题是,在应用程序代码本身中保留Secret是一种潜在的攻击媒介,因为有人可以检查APK以找到它。
在Android应用程序中真正保密秘密的最佳方法是什么,同时仍然保持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");
答案 0 :(得分: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固定,这将验证任何服务器的真实性。 https://developer.android.com/training/articles/security-ssl.html#Pinning