我正在研究必须保护数据的项目(揭示代码不是主要问题)文件。我们正在使用Java + Netbeans。是否有任何设施将以加密格式创建jar?我们也使用sqlite作为数据库 - 因此将文本文件加密为加密格式也不适合我们。
答案 0 :(得分:21)
创建加密的JAR是不可能的,因为执行的JavaVM必须能够以某种方式读取它想要执行的数据。 与VM类似,任何拥有适当工具和专有技术的人都可以从JAR中提取所有数据。
如果可以加密JAR,你还必须向想要执行JAR的客户端提供一些解密密钥或工具,这完全违背了加密的目的。
你能得到的最好的是混淆,但这对雄心勃勃的攻击者来说并不是真正的安全或障碍。
答案 1 :(得分:9)
我同意Kosi2801。类文件加密只是模仿安全性(参见http://www.excelsior-usa.com/articles/java-obfuscators.html) 使用自定义ClassLoader可以破坏应用程序,例如在应用程序服务器中。
有更好的方法:在类文件中使用String常量的加密。大多数商业混淆器具有此功能,例如Allatori,Stringer Java Obfuscation Toolkit,Zelix KlassMaster,Smokescreen,DashO(超级昂贵)。 Stringer Java Obfuscator具有调用上下文检查和完整性控制功能,这使得保护很难被破解。
最安全的方法是在JavaCard等外部设备上存储和执行部分字节码。
N.B。我是Licel LLC的首席执行官。 Stringer Java Obfuscator的开发人员。
答案 2 :(得分:7)
Kosi2801非常正确。我能想到的唯一能做的就是以下,但这很难看。
这将允许您加载类。你可以做同样的事情(没有类加载器)来加载其他资源。
虽然实施起来很有趣(对于那些喜欢挑战的人)但是有一些问题:
所以你可以给人们带来复苏,让事情变得更加困难,但是在你给予你所能做的一切的情况下,试着让其他人投入的时间不值得。
软件保护很难,尤其是像Java这样容易被反编译的东西,并且不能像C / Assembly那样改变它自己的代码。有一个原因,一些最昂贵的软件需要硬件加密狗或锁定到某个CPU或其他硬件。
答案 3 :(得分:3)
通常,如果您希望应用及其数据是自包含的,则无法以安全的方式执行此操作。但是,您当然可以加密文件并使用隐藏在代码中的密钥对其进行描述。一个坚定的黑客可以得到它,但如果这不是你担心的,那很好。如果这样做,请记住无法压缩加密数据,因此先压缩,然后加密。
如果您确实需要数据是安全的(例如,机密数据),您将需要使用密钥加密数据,并通过一些外部手段将该密钥提供给应用程序,例如将其放在拇指驱动器上并获取通过安全的快递给用户。
通过SSL提供数据(或密钥)的另一种可能性,并使用良好的身份验证方法来验证您的用户是谁。
一般而言 - 任何系统都不可能完全安全,但它也不是必需的。一个系统只需要足够安全,以阻止你认为会试图破解它的攻击者。
答案 4 :(得分:2)
另一种选择是制作一个自动解密JAR的自定义JVM。但同样的问题仍然存在:在某些时候,JAR Java类必须被解密才能由JVM运行,并且在那时它们可以被捕获和解编译。
更不用说拥有自定义JVM会要求所有用户也下载该JVM。
答案 5 :(得分:1)
您可以使用CipherOutputStream和CipherInputStream以加密格式将Java对象序列化到磁盘。这可能是一个用于保存数据的选项。