我在我的android应用中使用了一些第三方API密钥和我的服务器URL。众所周知,任何人都可以很容易地对APK进行反向工程,并可能滥用细节。
我知道一些保证代码安全的方法。
程序混淆使关键字符串和URL保持不变。
将凭据保留在本机代码中。
有没有其他方法来保护敏感细节,如API密钥和URL的安全?
提前谢谢。欢迎任何类型的解决方案。
发布于 2015-11-25 06:25:47
这是一个相当开放的问题,我们可以尽可能多地讨论。所有这一切将归结为一件事:如果你把你的产品给别人,那么他/她可以做任何级别的逆向工程。所以最好的方法是把它保存在服务器上,然后加密传输。如果你想把它放到你的apk中,那么最好的办法就是通过使用proguard或dexguard等混淆来使其难以阅读。
发布于 2015-11-25 06:55:15
一种可能的解决方案是加密应用程序中的数据,并在运行时使用解密来使用这些数据。我还建议使用程序来使反编译的应用程序难以阅读和理解。例如:
// "the real string is: "mypassword" ";
//encoded 2 times with an algorithm or you can encode with other algorithms too
public String getClientSecret() {
return Utils.decode(Utils
.decode("Ylhsd1lYTnpkMjl5WkE9PQ=="));
}
被保护应用的反编译源代码是这样的:
public String c()
{
return com.myrpoject.mypackage.g.h.a(com.myrpoject.mypackage.g.h.a("Ylhsd1lYTnpkMjl5WkE9PQ=="));
}
至少对我来说已经够复杂的了。当我别无选择,只能在我的应用程序中存储值时,我就是这样做的。当然,我们都知道这不是最好的方法,但它对我来说很有效。
/**
* @param input
* @return decoded string
*/
public static String decode(String input) {
// Receiving side
String text = "";
try {
byte[] data = Decoder.decode(input);
text = new String(data, "UTF-8");
return text;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "Error";
}
反编译版本:
public static String a(String paramString)
{
try
{
str = new String(a.a(paramString), "UTF-8");
return str;
}
catch (UnsupportedEncodingException localUnsupportedEncodingException)
{
while (true)
{
localUnsupportedEncodingException.printStackTrace();
String str = "Error";
}
}
}
你可以在google中找到这么多的加密器类。
发布于 2015-11-25 06:32:31
正如rockflight所说,也许是这样的。您可以尝试使用此命令
你的(移动或网络)客户端不应该包含你的Firebase的密码。在某种程度上,有人会对你的代码进行反向工程,提取密钥,并用这些能够读/写你的Firebase数据库中的所有数据。在此阶段,您唯一能够做的事情就是撤销Secret,这将使所有客户端都失败。
Firebase主机仅允许您存储静态资源。因此,虽然您可以将API密钥存储在Firebase的托管服务器上,但这对安全性没有太大帮助。它仍然是每个人都可以阅读的。
相反,您应该在客户端中使用常规的Firebase身份验证。
有用的链接
https://stackoverflow.com/questions/33909650
复制相似问题