我们开发了一个在带有 Linux Debian 发行版的微型计算机上运行的应用程序。该应用程序是用 Java 编写的,因此不会编译为可执行文件。 (意味着可以轻松打开java文件查看代码)
微型计算机总是内置在外壳中,但如果有人破解了这个外壳,他就可以窃取外部存储并拥有我们的应用程序(和源代码)。我们希望保护我们的应用程序免受这种情况的影响。
我做了一些研究,但我只能发现我们可以混淆我们的代码。实际上这还不够,所以我正在寻找其他(更安全)的方法来保护我们的代码免受能够获取存储介质的人的侵害。
我们已经考虑过在其中放置代码的加密文件夹,但我不确定这是否可行以及这是否是一个好方法。有谁可以帮助我找到解决方案或向我解释在 Linux 上保护 Java 代码的最佳实践吗?
答案1
如果人们可以物理访问运行您的代码的计算机,那么他们就可以访问您的代码。如果您不希望人们访问您的代码,请不要授予他们访问权限。
加密代码在您描述的场景中没有用。计算机必须解密代码才能运行它。如果计算机可以解密代码,那么它必须在某处拥有解密密钥,并且任何具有物理访问权限的人也可以解密该代码。
例外情况是计算机提供受物理保护的安全执行环境。智能卡提供这样的环境并且相当便宜,但它们的计算能力非常有限。 (请注意,仅用于存储较大计算机上加密代码密钥的智能卡对您没有帮助,因为较大计算机将成为攻击目标,而不是智能卡。)硬件安全模块也提供这样的环境,并且功能大致与低端 PC 一样强大,但它们非常昂贵。一些具有基于受保护环境的计算机英特尔SGX或者ARM 信任区提供中等级别的保护,仅针对“偶然”物理攻击(打开外壳但不要尝试破解芯片)。
但实际上,对二进制文件进行逆向工程的成本并不是那么微不足道,而且维护源代码的成本非常高。如果您的应用程序有用,那么额外的安全措施就很少有商业价值:您真正销售的是支持。