我的Java程序在一个目录中构建一些文件(.html和.txt文件)。 为了完成一个项目,我想“打包”这些文件,例如将其发送给另一个人。 但是其他人不应该简单地“解压缩”文件并操纵html / txt-Files。只用我的Java程序打开打包文件。
我的想法是,使用主密码(在Java程序中设置)保护压缩目录。之后我可以通过电子邮件发送zip文件,而另一个人只能用我的程序打开它。 不幸的是,没有简单而自由的方法来用Java压缩/解压缩带有密码的文件夹。
所以也许你有另一个想法?
好的我想我必须多解释一下这个问题: 我可以用我的程序创建一个小培训。培训包含带有信息(html文件)的“普通”页面和带有多项选择题的页面(问题和答案保存在txt文件中)。最后,培训用户可以打印认证(“用户XXX进行了培训”)。为了进行训练,将html / txt文件读入我的程序。 好的,我的问题是用户可以看到(并操纵)文件。但是他可以在txt文件中看到多项选择测试的正确答案。
答案 0 :(得分:3)
没有100%的方法可以阻止人们阅读文件,但是你可以让它变得更加困难。您需要做的是加密文件以防止随意阅读,或签署文件以便您可以检测真实性和篡改。
以下概述了如何使用公钥/私钥加密对文件进行加密。您需要的工具是:
您将使用GPG的命令行加密文件,并使用BouncyCastle(BC)从Java读取文件。
以安全的方式执行此操作所涉及的步骤是。
为GPG签名/加密创建唯一的公钥/私钥对。例如gpg --gen-key
并按照屏幕上的说明操作。您通常可以选择默认设置,并将您的密钥称为“app-security-key@mydomain.com”
加密Java将处理的文件。例如gpg -e myfiles.zip
加密。如果数据变化很大,你可以很容易地从脚本中完成这个。加密通过使用公钥加密文件来工作。希望解密文件的人需要相应的私钥。
从密钥对导出私钥。例如档案gpg --export-secret-key -a > decryption.key
。
创建一个只包含您导出的密钥的新密钥环。 e.g。
mkdir tmpkeys gpg -homedir = tmpkeys --import decryption.key cp tmpkeys / secring.gpg keyring
在Java程序中,将密钥环作为资源嵌入或通过base64对其进行编码并将其作为字符串注入代码中。保留您的公钥,确保您不会无意中将其与您的应用程序一起发货。
使用BouncyCastle PGP打开密钥环。
这是伪代码,因此请阅读BC API以获取详细信息。
// During initialisation
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
// During decryption
InputStream is = openKeyring(); // Wherever your keyring is
InputStream isData = openDataFile();
try {
PGPSecretKeyRing kr = new PGPSecretKeyRing();
PGPSecretKey sk = kr.getSecretKey();
PGPPrivateKey pl = sk.extractPrivateKey("mypassphrase", securityProvider);
PGPObjectFactory of = new PGPObjectFactory(isData);
Object o;
while ((o = of.nextObject) != null) {
if (o instanceof PGPCompressedData) {
readAndDoWhateverINeedtoDo((PGPCompressedData) o).getDataStream());
}
}
}
catch (Exception e) {
rejectFile(e);
}
基本上,Java应用程序获取加密文件,将其与私钥一起提供给BC,并返回一个可以从中读取明文的InputStream。如果它有问题,它将抛出一个异常,您可以将其视为致命错误。
请注意以下几点:
答案 1 :(得分:1)
您可以做的一件事是为您想要的每个文件生成一个CRC编号,并将其与jar文件一起打包到属性文件中。每次用户选择文件时,请检查CRC值以确保没有人编辑你的文件。这不是完全万无一失的方法。
类似问题:
其他有用的链接:
就像在上面给出的链接中从jar动态加载图像一样,你可以从jar加载html和txt文件。
答案 2 :(得分:1)
你要求的是从根本上不可能以安全的方式做到(除非所有有趣的事情发生在服务器上) - 只要问最近尝试制作DRM系统的人。 (我看着你,育碧)。
如果您只是想要一个简单的检查来阻止(非常)偶然的攻击者,那么如上所述将支持文件存储在zip中,并将SHA1总和与运行时编码到程序中的值进行比较。有人可以修改你的代码(或者java使用反编译器)并删除检查,但它确实和任何东西一样好。
答案 3 :(得分:0)
不幸的是,真的没有太多工作要做。这是编写Web应用程序的优点之一;用户只看到输入和输出,但实际上并没有访问应用程序本身。每当您分发诸如JAR的应用程序时,始终可以对其进行反向工程和修改;没有混淆或加密可以彻底或完全阻止它。