当前位置: 首页 > 面试题库 >

如何保护解密密钥免于反编译?

汝岳
2023-03-14
问题内容

我是Java初学者。我正在开发可解密某些数据的应用程序。解密密钥被硬编码到软件中,因此可以通过分析字节码看到。

我知道不能完全防止逆向工程,所以我想做的就是使过程尽可能地艰巨。

我的想法不是直接将密钥放入代码中,而是将其进行某种转换。例如,我可以写-

private static final byte[] HC256A = Hex
            .decode("8589075b0df3f6d82fc0c5425179b6a6"
                    + "3465f053f2891f808b24744e18480b72"
                    + "ec2792cdbf4dcfeb7769bf8dfa14aee4"
                    + "7b4c50e8eaf3a9c8f506016c81697e32");

这样,查看字节码的人无法立即读取它。但是将必须遵循逻辑并对其进行转换,这在字节级别上不会那么容易。

那么你们怎么看?这有用吗?除了十六进制解码,什么是最好的转换?是否有其他方法可以保护硬编码的解密密钥?

感谢您的所有建议。


问题答案:

正确处理此类混淆(尤其是字节码语言)的正确方法是将调试器附加到密钥通过的位置(如果无法进行调试,请从该位置开始分析代码)。这样,攻击者根本不需要寻找密钥,而且他也不在乎密钥的混淆程度。因此,您需要重新考虑您的设计。

如果您只想保护业余潜行者,则可以拆分密钥并对其各个部分进行XOR运算(可能使用不同的密钥)就足够了。还有一个技巧-
从代码中已经存在的文本常量(例如应用程序名称)派生密钥。这使得密钥不如拆分或XORing明显。



 类似资料:
  • 问题内容: 我正在编写我的第一个使用OAuth的应用程序。这是针对桌面应用程序的,而不是网站或移动设备,在这些应用程序上访问二进制文件会更加困难,因此我关注如何保护应用程序的密钥和机密。我觉得查看编译后的文件并找到存储密钥的字符串很简单。 我是否反应过度,或者这是桌面应用程序的真正问题(使用已知解决方案)? 该项目正在用Java进行编码,但是我也是C#开发人员,因此任何用于.NET的解决方案也将不

  • 问题内容: 我正在使用Java开发应用程序,但是我不会发布代码。问题是,我测试了其中的一个jar反编译器,它几乎可以完美地从我的jar文件中获取代码!我的问题是如何在不提取代码的情况下分发jar文件? 问题答案: 由于Java在编译过程中保留了大多数“元数据”(允许动态加载和反射),因此直接编译(不仅反汇编)已编译的类文件是一种直接的方法。这就是为什么恢复的代码与原始代码非常相似的原因。 虽然不是

  • 问题内容: 众所周知,有很多Java反编译器工具可以将.cl​​ass转换为.java文件。 因此,我们需要保护.java文件免于反编译。我知道这是一个大话题,也许没有止境。 通常,有两种方法:混淆器和定制的类加载器。 是否有将这两种方式结合在一起的成熟解决方案或开源框架? 另一个方面与exe4j有关,它将jars打包到exe文件中,似乎可以保护java代码,因为我们看到的是exe文件而不是jar

  • 我正在使用AES加密实现一个加密字符串的程序,并希望将我的“密钥”保存在一个文件中,而不是在源代码中硬编码。 但是,这给我带来了一个问题,我如何保护这个秘密密钥不被他人看到? 如果我要再次加密这个“密钥文件”,我将不得不再次处理同样的问题。 我该如何处理这些问题? 参考:https://wiki.sei.cmu.edu/confluence/display/java/MSC61-J.不要使用不安全

  • PEMException:创建加密私钥时出现问题:System.NullReferenceException:对象引用未设置为对象的实例。在org.bouncycastle.openssl.pemreader.readprivateKey(PemObject PemObject) 下面是Decrypt方法的代码:

  • 我试图保护Spring BootAPIendpoint。我希望只传递api密钥和秘密作为头的一部分来调用api。我尝试了这个链接中发布的代码。但是在头中使用授权调用api时拒绝访问。使用API key和secret保护Spring Boot API我想知道我应该作为头部的一部分传递什么,这样我就可以从API获得成功的响应。我做了以下步骤:我在application.properties中添加了以下