在java中混淆​​连接字符串

时间:2014-08-07 15:03:54

标签: java obfuscation proguard

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

4 个答案:

答案 0 :(得分:0)

一个简单的解决方案是对字符串文字进行base64编码,并在需要时对其进行取消编码。这样,它就不会以纯文本形式显示出来。

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

答案 1 :(得分:0)

而不是

String secret = "secret";

DO

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 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

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

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