【问题标题】:Adding dependent text files to JAR file将依赖文本文件添加到 JAR 文件
【发布时间】:2014-06-20 01:46:48
【问题描述】:

我有一个 JAR 文件,它依赖于 5 个不同的文本文件。 JAR 文件读取文本文件并给出结果。我唯一的问题是我想隐藏文本文件,这样任何人都看不到它。请建议我如何将这些文本文件添加到 JAR 包中。如果有人知道 JAR-TO-EXE 工具,以便将文本文件隐藏到 EXE 中,那么它也是可以接受的。

【问题讨论】:

  • 我认为这是您的代码,而您正在自己创建 jar 文件?

标签: java jar


【解决方案1】:

我建议您将序列化作为一种​​可能的解决方案,这里有一个链接。

http://www.tutorialspoint.com/java/java_serialization.htm

我不是 100% 确定无论如何都无法重建您的数据,但是...当您打开文件时,文件的内容肯定是乱码(即使您不想为此使用它,无论如何也要学习它它非常有用)。

编辑:我想详细说明一下,这样你就知道它基本上是什么(如果你不知道的话)......假设你有一个包含对象的数组列表(你需要保存的数据,比如你自己的员工类或其他. 通过序列化,您基本上可以将该列表序列化为文件,当您想要加载数据时,只需将其反序列化即可。保存数据的文件将对打开它的任何人都包含乱码。实际上比使用普通文件要容易得多,您通常必须在其中处理读取每一行等。还请记住,您必须在需要使用的类中实现 Serializable 接口。

给你做一个简单的例子,下面我使用了一个非常简单的类,叫做 testing,它只包含一个名字:

public class Testing implements Serializable {

    private String name;

    public Testing(String name) {
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

现在要序列化此类的对象,请记住,您也可以使用对象的数组列表来执行此操作,但它在静态上下文中不起作用!所以你不能在主方法 fx 中测试它。

        File file = new File("test.dat");
        if (!file.exists()) file.createNewFile();

        try {
            ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("test.dat"));
            out.writeObject(new Testing("testobject"));
        } catch(Exception ex) {}


        try {
            ObjectInputStream in = new ObjectInputStream( new FileInputStream("test.dat"));
            Testing loadedObject = (Testing) in.readObject();
            System.out.println( loadedObject.getName() );
        } catch(Exception ex){}

如果您想查看上面的代码,可以在 main 方法中进行测试,只需复制粘贴并导入所需的内容即可。

编辑:应该提到我读到可以通过在序列化对象之前使用包装类来使用简单但安全的加密方法。但是您必须仔细阅读,尽管 imo 这将是一个非常优雅的使用解决方案。

【讨论】:

    【解决方案2】:

    您可以“隐藏” jar 中的文件,但它们仍然可以访问。只需解压缩 jar 即可访问其内容。如果这些文件无论如何都是“敏感的”,我建议考虑对它们进行加密。

    密码学本身是一门广泛的学科,需要真正了解才能创建安全的解决方案,但下面有一个使用 java 加密和解密数据的基本示例。

    http://www.software-architect.net/articles/using-strong-encryption-in-java/introduction.html

    编辑

    该链接建议使用以下内容:

    生成'aesKey'的相同代码:

     String key = "Bar12345Bar12345"; // 128 bit key
     // Create key and cipher
     Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
     Cipher cipher = Cipher.getInstance("AES");
    

    加密字符串:

        // encrypt the text
         String toEncrypt = "Your text.";
         cipher.init(Cipher.ENCRYPT_MODE, aesKey);
         byte[] encryptedBytes = cipher.doFinal(toEncrypt.getBytes());
         String encrypted = new String(encryptedBytes);
    

    解密字符串:

         // decrypt the text
         cipher.init(Cipher.DECRYPT_MODE, aesKey);
         String decrypted = new String(cipher.doFinal(encrypted.getBytes()));
    

    文件中存储的文本将完全无法理解。还有其他需要考虑的事情;例如,如果您将密钥存储在一个类中,则可以提取它。但是对于所有安全措施,创建它的复杂性必须与对抗它所涉及的困难相平衡。此级别最终取决于您要保护的信息的性质。


    如果你只是想将文本文件打包到 jar 中,并且它们的安全性不是问题,请参见以下内容(假设你使用的是 eclipse):

    How to package resources in Jar properly

    【讨论】:

    • 请把 JAVA 中的解密代码也发给我,因为您提供的链接只包含加密代码。
    • 已根据提供的链接添加代码示例。
    • 感谢您提供友好的解决方案。现在,如果我将文本文件打包到 jar 中,然后使用一些 jar-to-exe 工具将我现有的 jar 转换为 exe。文本文件有可能这样隐藏吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2014-01-05
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多