【问题标题】:Java: Possibilities to protect files against manipulationJava:保护文件免受操纵的可能性
【发布时间】:2011-04-11 13:05:25
【问题描述】:

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

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

所以也许你有别的想法?


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

【问题讨论】:

    标签: java


    【解决方案1】:

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

    这里概述了如何使用公钥/私钥加密来加密文件。您需要的工具有:

    1. GPG。您将使用它创建密钥
    2. BouncyCastle PGP。这是一个实现 OpenPGP 规范的 Java 加密 API。

    您将使用 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. 创建一个仅包含您导出的密钥的新密钥环。例如

      mkdir tmpkeys gpg -homedir=tmpkeys --import decryption.key cp tmpkeys/secring.gpg 密钥环

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

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

    【讨论】:

    • 非常感谢您的帮助。我加密了我的 .txt 文件,现在可以正常工作了 :)
    • 它仅适用于 jar 文件和类似 WAR 文件的 web 应用程序,我们应该使用纯 java 字节码在 web/应用程序服务器上部署应用程序,例如 tomcat,wildfly 不适用。
    【解决方案2】:

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

    类似问题:

    其他有用的链接:

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

    【讨论】:

      【解决方案3】:

      您所要求的基本上不可能以安全的方式完成,(除非所有有趣的事情都发生在服务器上)- 只需询问最近尝试制作 DRM 系统的任何人。 (我在看着你,育碧)。

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

      【讨论】:

      • +1 显然,任何体面的哈希都可以。不需要是 SHA1。
      【解决方案4】:

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

      【讨论】:

      • 嗨迈克尔,非常感谢您的回答。但这不是问题。我不想保护我的应用程序的 jar 文件 - 但我用我的 java 程序构建的文件。
      • @muffin,但这是同样的问题。您的应用程序数据是您的应用程序的一部分(它本身可能不是可执行文件,但它与您的可执行文件一起构成了您的应用程序的功能)。您可以做的最好的事情是对数据进行某种校验和,将校验和发送到您的服务器,并让它发回一些用于解密数据的令牌或类似的东西。您还可以经常更新数据。但是这种东西还是可以打败的。
      • 好吧,我想我得再解释一下这个问题:我可以用我的程序创建一个小型培训。培训包含带有信息的“普通”页面(html 文件)和带有多项选择问题的页面(问题和答案保存在 txt 文件中)。最后,培训用户可以打印一份证明(“用户 XXX 进行了培训”)。为了进行培训,将 html/txt 文件读入我的程序。好的,所以我的问题是用户可以查看(和操作)文件。但是他可以在txt文件中看到多项选择题的正确答案。
      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      相关资源
      最近更新 更多