gpt4 book ai didi

java - 这是混淆代码的有效方法吗?性能友好吗?

转载 作者:行者123 更新时间:2023-12-02 05:41:29 26 4
gpt4 key购买 nike

所以我最近想到了一种方法,可以让代码反混淆变得更加困难。但我不太确定这是否会对我的代码的性能产生负面影响:所以我的想法是改变这段代码:

public class SpeedTest1 {

public static void main(String[] args){
long start = System.currentTimeMillis();

String toEncode = "fhsdakjfhasdkfhdsajkhfkshfv ksahyfvkawksefhkfhskfhkjsfhsdkfhjfhskjhafjkhskjadfhksdfhkjsdhfksfhksdhfsdyfieyt893489ygfudhgiueryriohetyuieyiuweatiuewytiueaytuiwfytwuiediuvnhuighsiudghfjdkghfsdkjghdiugfdkghdkjghdfkghfdghdigyeuriyeibuityeuirtuireytiuerythgfdkgiuegduigkghfdjkghjgkdfhgjfdhgjfdghfdkjghfdjkghfdkjghfdjkgfdjkghfdkjghfdjkgfdkjghfdkjgheriytretyretrityreiutyeriuhslfjlflkfflksdjflkjflks";
String str = Base64.encode(toEncode.getBytes());
try {
System.out.println(new String(Base64.decode(str), "UTF-8"));
} catch (Base64DecodingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

long end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
}
}

进入这段代码:

public class SpeedTest2 {

public static void main(String[] args){
long start = System.currentTimeMillis();

System.out.println(y(x(z(a().getBytes()))));

long end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
}

private static String y(byte[] b){
try {
return new String(b, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}

private static byte[] x(String s){
try {
return Base64.decode(s);
} catch (Base64DecodingException e) {
e.printStackTrace();
}
return null;
}

private static String z(byte[] b){
return Base64.encode(b);
}

private static String a(){
return "fhsdakjfhasdkfhdsajkhfkshfv ksahyfvkawksefhkfhskfhkjsfhsdkfhjfhskjhafjkhskjadfhksdfhkjsdhfksfhksdhfsdyfieyt893489ygfudhgiueryriohetyuieyiuweatiuewytiueaytuiwfytwuiediuvnhuighsiudghfjdkghfsdkjghdiugfdkghdkjghdfkghfdghdigyeuriyeibuityeuirtuireytiuerythgfdkgiuegduigkghfdjkghjgkdfhgjfdhgjfdghfdkjghfdjkghfdkjghfdjkgfdjkghfdkjghfdjkgfdkjghfdkjgheriytretyretrityreiutyeriuhslfjlflkfflksdjflkjflks";
}
}

现在第二 block 更难弄清楚它的作用。但现在我担心我的程序的性能,所以我添加了检查时间线,看​​看两者之一是否比另一个更快。现在大多数情况下,它们都打印 0 作为时间,但有时两者之一打印类似 15 的内容,但这绝不是相同的方法。我确实找到了这个答案[java how expensive is a method call这表明 Java 本身会在运行时优化代码,因此这意味着使用两个示例中的哪一个并不重要,对吧?因为它们在执行时都是相等的。所以我现在想知道这是混淆代码的好方法还是会对代码效率产生负面影响?

最佳答案

关于一般的混淆:

1) 您想保护什么?

1.1) Java 初学者理解你的代码:你的方法可能没问题

1.2) Java 专家理解您的代码:您的方法不会真正起作用,甚至可能不会使专家的速度降低超过 2 倍

1.3)竞争对手了解您的代码:您的方法不会真正起作用,竞争对手可能会在该任务上投入大量资源

2)以后需要维护代码吗?

2.1)是的:您需要将原始来源转换为模糊变体的东西(见下文)

2.2) 否:您可能对此感到满意,但是,如果您稍后需要修复错误,您可能无法理解您之前创建的内容(即使有记录的代码,专家也会经常发生这种情况...... )

混淆工具:

话虽如此,您可能想看看 ProGuard (http://proguard.sourceforge.net)。它是一个 Java 混淆器,甚至可以提高低资源平台上的性能(主要是通过缩短类和包名称以及减少要推送的类文件的大小)。

有加密类加载器。它增加了对手的难度,但你并不安全 - 请参阅this article .

关于性能:

无论是否进行更改,您都必须运行性能测试。您需要在软件最终运行的平台上执行此操作。有些代码肯定较慢,有些代码肯定较快 - 然而,最终您需要测试它。

关于java - 这是混淆代码的有效方法吗?性能友好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com