java常量反对字节码逆向工程

时间:2012-06-11 15:03:48

标签: java string encryption reverse-engineering bytecode

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

private static final String ZIP_PASSW="secret"

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

谢谢

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

如果将密钥存储在代码中,则可以通过逆向工程检索密钥。如果您在编译之前或之后存储密钥也无关紧要。

您无法使用您的程序提供任何类型的(未加密的)密钥,而无法对其进行反向工程。这就是为什么首先发明了非对称加密的原因。

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

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

答案 2 :(得分:2)

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

如果这不足以满足您的需要,那么最标准的响应可能是集成某种PGP密钥交换而不是使用对称加密。

答案 3 :(得分:1)

您可以做的最好的事情是让访问变得更加困难。可以使用存储在代码中的密码来解密任何加密的字符串。您可以采取措施隐藏密码,但使用私有常量不是这种措施之一。

答案 4 :(得分:0)

如何存储已加密的密码?

答案 5 :(得分:0)

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