Java:保护文件免受操纵的可能性

时间:2010-09-13 07:40:52

标签: java

我的Java程序在一个目录中构建一些文件(.html和.txt文件)。 为了完成一个项目,我想“打包”这些文件,例如将其发送给另一个人。 但是其他人不应该简单地“解压缩”文件并操纵html / txt-Files。只用我的Java程序打开打包文件。

我的想法是,使用主密码(在Java程序中设置)保护压缩目录。之后我可以通过电子邮件发送zip文件,而另一个人只能用我的程序打开它。 不幸的是,没有简单而自由的方法来用Java压缩/解压缩带有密码的文件夹。

所以也许你有另一个想法?


好的我想我必须多解释一下这个问题: 我可以用我的程序创建一个小培训。培训包含带有信息(html文件)的“普通”页面和带有多项选择题的页面(问题和答案保存在txt文件中)。最后,培训用户可以打印认证(“用户XXX进行了培训”)。为了进行训练,将html / txt文件读入我的程序。 好的,我的问题是用户可以看到(并操纵)文件。但是他可以在txt文件中看到多项选择测试的正确答案。

4 个答案:

答案 0 :(得分:3)

没有100%的方法可以阻止人们阅读文件,但是你可以让它变得更加困难。您需要做的是加密文件以防止随意阅读,或签署文件以便您可以检测真实性和篡改。

以下概述了如何使用公钥/私钥加密对文件进行加密。您需要的工具是:

  1. GPG。您将使用此
  2. 创建密钥
  3. BouncyCastle PGP。这是用于实现OpenPGP规范的Java加密API。
  4. 您将使用GPG的命令行加密文件,并使用BouncyCastle(BC)从Java读取文件。

    以安全的方式执行此操作所涉及的步骤是。

    1. 为GPG签名/加密创建唯一的公钥/私钥对。例如gpg --gen-key并按照屏幕上的说明操作。您通常可以选择默认设置,并将您的密钥称为“app-security-key@mydomain.com”

    2. 加密Java将处理的文件。例如gpg -e myfiles.zip加密。如果数据变化很大,你可以很容易地从脚本中完成这个。加密通过使用公钥加密文件来工作。希望解密文件的人需要相应的私钥。

    3. 从密钥对导出私钥。例如档案gpg --export-secret-key -a > decryption.key

    4. 创建一个只包含您导出的密钥的新密钥环。 e.g。

      mkdir tmpkeys gpg -homedir = tmpkeys --import decryption.key cp tmpkeys / secring.gpg keyring

    5. 在Java程序中,将密钥环作为资源嵌入或通过base64对其进行编码并将其作为字符串注入代码中。保留您的公钥,确保您不会无意中将其与您的应用程序一起发货。

    6. 使用BouncyCastle PGP打开密钥环。

    7. 这是伪代码,因此请阅读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. 您需要在Java应用程序中的某处嵌入密码,但它不必与保护您的公钥的密码相同。请记住,我们将私钥导出到临时密钥环中,以便您可以在那里更改密码。
      2. 一个坚定的攻击者仍然可以破解你的Java文件来提取私钥&密码,或打印出明文或完全删除此测试。我建议如果这是一个担心你应该混淆你的代码并进行暗中检查,以确保不以某种方式绕过验证。但是没有什么可以阻止这种100%。
      3. 只是签名文件类似于加密,除非您发出公钥并保密私钥。在这种情况下,Java应用程序可以检测文件篡改,但有效负载是纯文本。
      4. 当你知道BouncyCastle很简单,但文档很糟糕。您应该下载源代码,因为有一些测试样本会让您选择正确的课程。

答案 1 :(得分:1)

您可以做的一件事是为您想要的每个文件生成一个CRC编号,并将其与jar文件一起打包到属性文件中。每次用户选择文件时,请检查CRC值以确保没有人编辑你的文件。这不是完全万无一失的方法。

类似问题:

其他有用的链接:

就像在上面给出的链接中从jar动态加载图像一样,你可以从jar加载html和txt文件。

答案 2 :(得分:1)

你要求的是从根本上不可能以安全的方式做到(除非所有有趣的事情发生在服务器上) - 只要问最近尝试制作DRM系统的人。 (我看着你,育碧)。

如果您只是想要一个简单的检查来阻止(非常)偶然的攻击者,那么如上所述将支持文件存储在zip中,并将SHA1总和与运行时编码到程序中的值进行比较。有人可以修改你的代码(或者java使用反编译器)并删除检查,但它确实和任何东西一样好。

答案 3 :(得分:0)

不幸的是,真的没有太多工作要做。这是编写Web应用程序的优点之一;用户只看到输入和输出,但实际上并没有访问应用程序本身。每当您分发诸如JAR的应用程序时,始终可以对其进行反向工程和修改;没有混淆或加密可以彻底或完全阻止它。