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