【问题标题】:java constant against bytecode reverse engineeringjava常量对字节码逆向工程
【发布时间】:2012-06-14 12:18:15
【问题描述】:

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

private static final String ZIP_PASSW="secret"

但我不希望一个简单的反转字节码显示原始密码......你认为有什么可以避免吗?

谢谢

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

【问题讨论】:

  • 我认为这是一个很好的问题,并且在某些情况下异步加密(因为每个人都在这里尖叫这个流行词)不会帮助你解决这个问题。例如。当您想在应用程序数据库中存储用户指定的密码时,您需要能够以明文形式检索该密码,但您不想将其以明文形式存储在数据库中。因此,您的应用程序必须能够对其进行加密和解密 => 您将遇到同样的问题,即您必须提供的密钥(分别用于异步加密的两个密钥)。不管你是否使用同步的东西作为 AES。

标签: java string encryption reverse-engineering bytecode


【解决方案1】:

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

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

【讨论】:

  • 公共字符串不是一个好主意 :-) 我喜欢这个解决方案... :-) 我知道这不是很安全,但总比没有好
  • jad 仍会将其反编译为:private static final String KEY = new String(new char[] { 's', 'e', 'c', 'r', 'e', 't'});
  • 对于大多数反编译器来说,这无济于事,正如 maksimov 已经说过的那样
  • 如何用简单的算术(rot13、xor 等)来保护密钥免受第一个视图的影响?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我必须创建一个数据库转储文件,让用户备份外部存储器中的所有数据。但我不想要一个普通文件......
    • 您的用户如何上传公钥,然后您可以加密数据,但没有私钥就无法解密。他们以加密方式下载它,并可以在闲暇时对其进行解密。
    • 我不明白为什么非对称密钥可以解决我的问题...我仍然需要将私钥存储在我的代码中还是我错了?
    • 非对称密钥只需要私钥解密,所以如果你有公钥不解密可以加密。显然需要精明的用户或管理解密的某种客户端,但您永远不会存储私钥——只存储公钥。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2011-01-12
          • 2011-04-26
          • 2011-11-18
          • 1970-01-01
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多