模糊处理:在java中隐藏硬编码值

模糊处理:在java中隐藏硬编码值,java,android,security,proguard,Java,Android,Security,Proguard,可能重复: 我正试图隐藏一些我的应用程序的静态字符串,以使其更难反编译,就像在模糊代码中更难找到密码算法名称之类的常量一样 我考虑过以下情况: String CONCAT= "concat"+"string"; String RAW_STRING= "raw_string"; String FROM_BYTES=new String("from_bytes".getBytes()); String FROM_CHARS=new String(new char[]{'f','r','o','m'

可能重复:

我正试图隐藏一些我的应用程序的静态字符串,以使其更难反编译,就像在模糊代码中更难找到密码算法名称之类的常量一样

我考虑过以下情况:

String CONCAT= "concat"+"string";
String RAW_STRING= "raw_string";
String FROM_BYTES=new String("from_bytes".getBytes());
String FROM_CHARS=new String(new char[]{'f','r','o','m','_','c','h','a','r','s'});
String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50});
最后两个选项似乎比原始选项“更暗”,但我认为有更好的方法可以做到这一点


我该如何改进这一点?谢谢你,你不应该只是写信

String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50});
char数组实际上是一个字符串,这是一个毫无意义的泄露

您可以同时执行以下操作:

  • 将“字符串”放入int[]数组中
  • 或者更好的方法是,将字符串分成几个int数组
  • 在应用程序的各个阶段计算/操作数组的值,因此它的值只在运行时的某个时间间隔内有效,从而确保不会通过反编译代码一眼就破译它
  • 在最终将数组转换为要传递给字符串构造函数的单个数组之前,通过局部变量、回实例变量等来回传递数组
  • 使用后立即将字符串设置为null,以减少实际字符串在运行时存在的时间

  • 我更喜欢使用解密算法在静态(类)初始值设定项中设置值 差不多

    class ...
      String CONCAT;
    
      static {
         CONCAT = uncrypt ("ahgsdhagcf");
      } 
    
    其中,uncrypt可能是一个很好的非加密算法,或者是一个较弱的base64解码


    在任何情况下,您都需要一个简单的程序来首先对字符串进行编码。

    是否有#3的模式或示例代码?#5有什么帮助?#5有帮助,因为如果有人可以反编译您的代码,这意味着他们也可以运行代码,将调试器标志放在适当的位置,等等。因此,您也应该防止运行时检查。这意味着您的实际字符串存在的时间越短,它就越不会被窥视。对于#3,我自己并没有走这么远,但您可以尝试或使用类似的方法将字符串“压缩”到字节数组中,并在需要时将其解压缩。不要使用Android的zip库,因为它的方法名不能混淆,这使整个企业变得非常明显。为了澄清,我使用了JZLib来压缩单个字符串,它确实有效,但它是为了减少数据大小,而不是为了混淆。尽管如此,当我用System.out.println替换密码实例化std库调用时,我不明白这是怎么回事。我从来没有为Android编程过,但是我看不出问题的重点。如果用户不知道如何反编译,只能通过记事本读取代码,您只需输入一些未使用的算法名称,他/她将不知道真正涉及的是哪一个。如果s/he知道如何反编译,那么就没有任何混淆可以阻止s/he用System.out.println替换库调用(我猜您使用一个已知的库和一个已知的方法名来实例化密码)。我使用简单的gradle函数隐藏此类字符串。它只能防止肉眼看到,但无论如何,它总比没有好: