我想知道是否可以在已编译的 java 文件中加密字符串。例如,我需要使用对称密钥解码 zip 文件,并且需要将该密钥存储在 java 类中的私有常量中:
private static final String ZIP_PASSW="secret"
但我不希望一个简单的反转字节码显示原始密码......你认为存在避免它的东西吗?
谢谢
PS:我不明白为什么SO说没有这个PS我的问题不符合标准
我想知道是否可以在已编译的 java 文件中加密字符串。例如,我需要使用对称密钥解码 zip 文件,并且需要将该密钥存储在 java 类中的私有常量中:
private static final String ZIP_PASSW="secret"
但我不希望一个简单的反转字节码显示原始密码......你认为存在避免它的东西吗?
谢谢
PS:我不明白为什么SO说没有这个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。
如果您将密钥存储在代码中,则始终可以通过逆向工程来检索它。此外,在编译之前或之后存储密钥也没关系。
如果没有对它进行逆向工程的可能性,您就无法使用您的程序提供任何类型的(未加密的)密钥。这就是为什么首先发明了非对称加密的原因。
因此,如果您坚持使用对称加密,则必须将密钥存储在应用程序之外(例如,在文本文件中),并将文件通过安全通道传递给程序用户。(谁当然可以以任何他们想要的方式使用密钥)。
如果这不是您想要的,您应该研究非对称加密技术。
当您说您需要使用对称密钥解码 zip 文件时,您肯定需要这样做吗?您可能需要查看您的整体架构,而不是考虑如何将密码存储为纯文本或如何对其进行编码等细节。例如,也许您的代码可以调用安全的 Web 服务来获取密钥而不是存储它?显然,如果没有更好地了解您的目标,就很难提出一个可行的替代方案,但是您所描述的内容将很难保持适当的安全 - 它会因默默无闻而安全,但不会很强大对付一个决心要找到你的钥匙的人。
如果这对于您需要做的事情还不够安全,那么最标准的响应可能是集成某种 PGP 密钥交换而不是使用对称加密。
你能做的最好的就是让它更难访问。任何加密的字符串都可以使用存储在代码中的密码进行解密。您可以采取措施隐藏密码,但使用私有常量不是此类措施之一。
不,如果你存储了一个加密的密码,你仍然需要在某个时候解密它,破解者可以反汇编你的代码并找出算法,并从中获取密码。
如何存储已经加密的密码?