Android 保存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并将其存储在那里。还有桌面应用和移动应用。这是一个非常开放的问题,我们可以尽可能多地讨论。所有这些都可以归结为

我在android应用程序中使用了一些第三方API密钥和我的服务器URL。众所周知,任何人都可以轻松地对APK进行反向工程,并且可能会误用细节

我知道一些保持代码安全的方法

Progourd-混淆使键字符串和URL保持不变

在本机代码中保留凭据

有没有其他方法可以保证敏感细节(如API键和URL)的安全


提前谢谢。欢迎您提供任何解决方案。

我不知道它是否足够安全,但您可以使用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不变。