针对字节码逆向工程的java常量

标签 java string encryption reverse-engineering bytecode

我想知道是否可以在已编译的 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

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

作为替代或补充,您可以使用混淆工具,例如 ProGuard .

关于针对字节码逆向工程的java常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10982723/

相关文章:

c++ - 为什么不能像这样复制 char 数组 charArray ="some string";

java - Eclipse Translator App - 单独翻译单词 - 不包含前面或后面的字符

sql - 在 SQL 中存储联系信息的最佳实践,我应该加密吗?

java - 在 Mockito.when 中多次使用相同的 ArgumentMatchers

java - 表格不显示

java - 从字符串中删除非字母字符会留下 UTF-16 高代理项

java - 在Java应用程序中加密用户名/密码然后将它们传输到服务器的最佳方法

java - Amazon CLI 并行部署

java - 使用 javax.xml.transform.Transformer

javascript - 可以使用非对称加密来保护通过 HTTPS 传输的信用卡信息吗?