【问题标题】:obfuscate connection string in java在java中混淆​​连接字符串
【发布时间】:2014-08-07 23:30:26
【问题描述】:

我用 Java 和库 ojdbc14 编写了一个小程序。 我已经对 jar 文件进行了混淆处理,但是如果我解压缩程序并检查一些类,我很容易看到我的数据库连接的连接字符串。 有人可以帮助混淆这些连接字符串吗? 感谢并为我的英语感到抱歉!

【问题讨论】:

  • 如果你混淆了连接字符串,你希望你的程序如何连接到数据库?你为什么要首先混淆连接字符串?
  • 只需放入一个属性文件并将对该文件的权限限制为仅运行应用程序的用户 ID

标签: java obfuscation proguard


【解决方案1】:

代替

String secret = "secret";

String alpha = "sce"; // odd letters
String beta = "fsu"; // even letters + 1
StringBuilder secret = new StringBuilder();
for (int i = 0; i < alpha.length() + beta.length(); ++i) {
    if (i % 2 == 1) {
        secret.append(alpha.charAt(i / 2);
    } else {
        secret.append((char)(beta.charAt(i / 2) - 1);
    }
}

你明白了。

【讨论】:

    【解决方案2】:

    一个简单的解决方案是对字符串文字进行 base64 编码,并在需要使用时取消编码。这样,它就不会在纯文本中可见。

    Apache Commons library 有一个可以使用的实用程序,它内置于Java 8

    【讨论】:

    • 那么这种转变的目的是什么?
    • @Raffaele 所以字符串文字在二进制文件中不可见。那是 OP 的问题,对吧?
    • OP 让我想起了常青树获取此文档的 的正则表达式是什么
    【解决方案3】:

    混淆的唯一目的是不让他人轻易窃取您的代码。在二进制文件被混淆之后,另一个程序员会发现修改和转售您的代码更加困难,或者使您的程序行为与您的预期不同(顺便说一下,Proguard 还删除了死代码,并且可能进行了其他优化,我不记得只是现在)。

    在源代码中隐藏常量没有任何价值。你可以找到数十亿种奇特的方式,但目的是什么?一旦攻击者获得了代码,它就不会检查数千个 .class 文件:相反,如果她只想查看连接字符串,她只会附加一个调试器。设置断点(JDBC 栈没有被混淆)并等待你的程序重建连接字符串。

    混淆不是加密。如果您不想将连接字符串与您的应用程序一起发送(可能是因为它包含一个秘密),那么只需在启动时以交互方式向用户要求该秘密,或者从标记为“安全”的某个位置读取。

    【讨论】:

      【解决方案4】:

      我建议您加密您的连接字符串并将密钥保存在 JAR 之外。使您的程序代码包含使用加密字节初始化的byte[]

      如果您不想要 JAR 外部的任何密钥,那么您唯一的选择是“通过默默无闻的安全性”。例如,您可以设计一些看似复杂的例程,在运行时生成加密密钥。例如,用固定的种子为随机数生成器播种,然后从中取出一些数字。

      穷人的加密方法是简单的异或。您可以生成固定的伪随机序列并使用它来异或连接字符串的每个字节:

      byte[] password = "password".getBytes(StandardCharsets.UTF_8);
      Random rnd = new Random(204862727);
      for (int i = 0; i < password.length; i++)
        password[i] ^= rnd.nextInt();
      // at this point password contains bytes which you would hardcode into your JAR
      System.out.println("Encrypted: "+new String(password, StandardCharsets.UTF_8));
      rnd = new Random(204862727);
      for (int i = 0; i < password.length; i++)
        password[i] ^= rnd.nextInt();
      System.out.println("Decrypted: "+new String(password, StandardCharsets.UTF_8));
      

      在我的系统上,打印出来

      Encrypted: �ع�gO�
      Decrypted: password
      

      【讨论】:

      • 谢谢。但是如果你把密码放在代码中。当有人解压 jar 时无法检查密码变量并看到纯文本,不是吗?谢谢和对不起我的英语
      • 我的意思是在 JAR 中包含密码,而是让 JAR 的合法客户端将密码传递给 JAR 中的方法。否则,请查看我通过默默无闻的安全示例。
      猜你喜欢
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2013-12-22
      • 2010-11-02
      相关资源
      最近更新 更多