我想知道是否可以在已编译的 java 文件中加密字符串。 例如,我需要用对称 key 解码一个 zip 文件,我需要将该 key 存储在一个私有(private)常量的 java 类中:
private static final String ZIP_PASSW="secret"
但我不希望一个简单的逆向字节码显示原始密码......你认为存在什么可以避免它吗?
谢谢
PS:我不明白为什么S.O.说我的问题没有这个PS就不符合它的标准
最佳答案
真正的黑客仍然能够解密密码,但如果您不将密码存储为字符串字面值,则可能会使解密变得更加困难。你可以使用:
private static final String KEY = new String(new char[]{'s', 'e', 'c', 'r', 'e', 't'});
这将产生字节码:
javap -c -v TestObfuscate
static {};
Code:
Stack=6, Locals=0, Args_size=0
0: new #10; //class java/lang/String
3: dup
4: bipush 6
6: newarray char
8: dup
9: iconst_0
10: bipush 115
12: castore
13: dup
14: iconst_1
15: bipush 101
17: castore
18: dup
19: iconst_2
20: bipush 99
22: castore
23: dup
24: iconst_3
25: bipush 114
27: castore
28: dup
29: iconst_4
30: bipush 101
32: castore
33: dup
34: iconst_5
35: bipush 116
37: castore
38: invokespecial #12; //Method java/lang/String."<init>":([C)V
41: putstatic #16; //Field KEY:Ljava/lang/String;
44: return
鉴于
private static final String ZIP_PASSW="secret"
返回
Constant pool:
const #8 = String #9; // secret
请注意,我没有调用常量 PASSWORD
或 ZIP_PASSW
(如果字符串是公开的,这很重要)。
作为替代或补充,您可以使用混淆工具,例如 ProGuard .
关于针对字节码逆向工程的java常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10982723/