3

我想知道是否可以在已编译的 java 文件中加密字符串。例如,我需要使用对称密钥解码 zip 文件,并且需要将该密钥存储在 java 类中的私有常量中:

private static final String ZIP_PASSW="secret"

但我不希望一个简单的反转字节码显示原始密码......你认为存在避免它的东西吗?

谢谢

PS:我不明白为什么SO说没有这个PS我的问题不符合标准

4

6 回答 6

4

真正的黑客仍然可以解密密码,但如果您不将密码存储为字符串文字,则可能会更难一些。你可以使用:

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

请注意我没有调用常量PASSWORDZIP_PASSW(如果字符串是公共的,这很重要)。

作为替代方案或除此之外,您可以使用混淆工具,例如ProGuard

于 2012-06-11T15:22:23.307 回答
3

如果您将密钥存储在代码中,则始终可以通过逆向工程来检索它。此外,在编译之前或之后存储密钥也没关系。

如果没有对它进行逆向工程的可能性,您就无法使用您的程序提供任何类型的(未加密的)密钥。这就是为什么首先发明了非对称加密的原因。

因此,如果您坚持使用对称加密,则必须将密钥存储在应用程序之外(例如,在文本文件中),并将文件通过安全通道传递给程序用户。(谁当然可以以任何他们想要的方式使用密钥)。

如果这不是您想要的,您应该研究非对称加密技术。

于 2012-06-11T15:23:22.500 回答
2

当您说您需要使用对称密钥解码 zip 文件时,您肯定需要这样做吗?您可能需要查看您的整体架构,而不是考虑如何将密码存储为纯文本或如何对其进行编码等细节。例如,也许您的代码可以调用安全的 Web 服务来获取密钥而不是存储它?显然,如果没有更好地了解您的目标,就很难提出一个可行的替代方案,但是您所描述的内容将很难保持适当的安全 - 它会因默默无闻而安全,但不会很强大对付一个决心要找到你的钥匙的人。

如果这对于您需要做的事情还不够安全,那么最标准的响应可能是集成某种 PGP 密钥交换而不是使用对称加密。

于 2012-06-11T15:16:18.927 回答
1

你能做的最好的就是让它更难访问。任何加密的字符串都可以使用存储在代码中的密码进行解密。您可以采取措施隐藏密码,但使用私有常量不是此类措施之一。

于 2012-06-11T15:16:45.653 回答
0

不,如果你存储了一个加密的密码,你仍然需要在某个时候解密它,破解者可以反汇编你的代码并找出算法,并从中获取密码。

于 2012-06-11T15:09:32.027 回答
0

如何存储已经加密的密码?

于 2012-06-11T15:07:13.260 回答