Android 保存API密钥和URL';安卓系统安全吗?
我在android应用程序中使用了一些第三方API密钥和我的服务器URL。众所周知,任何人都可以轻松地对APK进行反向工程,并且可能会误用细节 我知道一些保持代码安全的方法 Progourd-混淆使键字符串和URL保持不变 在本机代码中保留凭据 有没有其他方法可以保证敏感细节(如API键和URL)的安全Android 保存API密钥和URL';安卓系统安全吗?,android,obfuscation,reverse-engineering,api-key,Android,Obfuscation,Reverse Engineering,Api Key,我在android应用程序中使用了一些第三方API密钥和我的服务器URL。众所周知,任何人都可以轻松地对APK进行反向工程,并且可能会误用细节 我知道一些保持代码安全的方法 Progourd-混淆使键字符串和URL保持不变 在本机代码中保留凭据 有没有其他方法可以保证敏感细节(如API键和URL)的安全 提前谢谢。欢迎您提供任何解决方案。我不知道它是否足够安全,但您可以使用keepass并将其存储在那里。还有桌面应用和移动应用。这是一个非常开放的问题,我们可以尽可能多地讨论。所有这些都可以归结为
提前谢谢。欢迎您提供任何解决方案。我不知道它是否足够安全,但您可以使用keepass并将其存储在那里。还有桌面应用和移动应用。这是一个非常开放的问题,我们可以尽可能多地讨论。所有这些都可以归结为一件事:如果你把你的产品给别人,那么他/她可以做任何级别的逆向工程。因此,最好的方法是将其保存在服务器上,并通过加密进行传输。如果你想把它放到你的apk中,那么最好的办法是使用proguard或dexguard等模糊处理,使它难以阅读。正如rockflight所说,也许是这样。你可以试着用这个 您的(移动或网络)客户端不应包含Firebase的秘密。在某个时刻,有人会对你的代码进行反向工程,提取秘密,并利用这些信息读取/写入Firebase数据库中的所有数据。在那个阶段,你唯一能做的就是撤销这个秘密,这会让所有的客户端都失败 Firebase主机只允许存储静态资源。因此,虽然您可以将API密钥存储在Firebase的托管服务器上,但这对安全性没有多大帮助。它仍将为每个人所阅读 相反,您应该在客户端中使用常规Firebase身份验证 答案链接: 有用的链接
一种可能的解决方案是在应用程序中加密该数据,并在需要使用该数据时在运行时使用解密。我还建议使用progord使反编译的应用程序难以阅读和理解。例如:
// "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";
}
}
}
只需在谷歌上搜索一下,您就可以找到这么多的加密机类。最好的方法是将它们存储在服务器上,并根据需要进行检索。但在没有服务器的情况下该怎么办呢。如果我想保证代码本身的数据安全,请签出。回答你的确切问题,然后以加密的形式保存数据,这样只有你的代码才能解密。我承认我正在使用类似的方法,但充其量只能减慢黑客的速度。很明显,它是用base64编码的,黑客很容易破译。是的,我完全同意你的看法。正因为如此,我提到你可以使用任何其他算法。我使用了Base64算法,因为它很容易understand@Chicken然而,这是一个很好的建议。所以我也编辑了我的答案,让它更复杂;)啊,没错,很公平。但是,是的,我也在做同样的事情,尽管我仍然对此感到不安。似乎没有一种实际的方法可以保证密码中的密钥是安全的:/Thank,我试图让我的答案越来越好;)正如您所知,Progourd保持键字符串和URL不变。