Java:如何使写入文件的对象对人类不可读?

时间:2015-04-06 22:34:45

标签: java object objectoutputstream file-writing

我有一个存储密码的类(我将添加更多不仅仅是密码的东西),名为Data:

import java.io.Serializable;

public class Data implements Serializable{

    public String password = "";    

}

作为测试,我运行了这两个:

private static File datafile = new File("data.src");

public static void checkDatafile() {
        try {
            Data data = new Data();
            data.password = "Newwww";
            if (!datafile.exists()) {
                datafile.createNewFile();
                ObjectOutputStream oos = new ObjectOutputStream(
                        new FileOutputStream(datafile));
                oos.writeObject(data);
                oos.flush();
                oos.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

public static Data loadData(Data data) {
    try {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(datafile));
    data = (Data) ois.readObject();
    ois.close();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
    return data;
}

它完全写入和读取但是当我在记事本中打开data.src时,人类可以读取它并且密码不安全,这是data.src的输出:

ャ・ sr data.Data克ラ淕6J・ L passwordt Ljava/lang/String;xpt Newwww

密码很容易看到并且不安全,有没有办法在写入文件时对对象进行加密/编码,以便人类无法读取?

另外,我宁愿坚持使用标准的Java库来下载和使用其他库。

4 个答案:

答案 0 :(得分:2)

这取决于你的意思"不可读"。如果您的目标是阻止恶意攻击者提取密码,即使他们具有运行程序所需的权限,您也很难做到这一点。毕竟,如果程序可以解密密码,那么具有相同权限的人也可以。即使没有适当的权限,恶意用户也可能检查内存中的原始字节,并在有权访问计算机时提取密码。

另一方面,如果你可以合理地信任用户,但只是想避免让他们意外地以明文形式看到密码,那么任何数量的简单方案都会起作用;甚至只是将字符串序列化为十六进制代码点就足够了。

如果您必须存储密码本身,即您正在访问需要密码的第三方服务,您基本上必须锁定计算机并限制其对您的访问权限绝对信任。没有办法解决这个问题。有a number of resources描述encrypting passwords,但它们都依赖于您能够锁定系统某些部分的用户,通常是加密密钥或密码文本。

然而您可能根本不需要,也不应该实际存储密码。验证用户的标准方法是从不存储其密码,而是存储one-way hash密码。这(理论上)不可能破译回原始密码,但是通过散列用户登录时输入的密码并将其与您存档的散列进行比较,您可以验证他们的身份,而无需知道他们的密码是什么。 / p>

编辑:关于需要存储实际密码的系统还有一件事。除了锁定计算机之外,还需要创建一个强大的审计跟踪,记录所有访问密码的尝试。应记录和跟踪与该机器及其数据的每次交互,以便在出现问题时,您可以检查审计历史记录并了解问题的范围。如果您没有审计线索,您将不得不假设您的系统完全受到损害,因为您没有相反的证据。

答案 1 :(得分:1)

不是通过ObjectOutputStream。您必须使用加密库并加密完整文件或密码。

答案 2 :(得分:0)

您可以让Data类实现writeObject / readObject方法,以便在读取和写入对象时加密/解密密码。

private void writeObject(ObjectOutputStream os) throws IOException{
     password = encrypt(password);
     os.defaultWriteObject();
}

private void readObject(ObjectOutputStream os) throws IOException{
     os.defaultReadObject();
     password = decrypt(password);
}

加密/解密定义您希望使用的ecryption / decryption算法。这就是说,正如GregorRaýman的评论中所指出的,你可能会考虑只是哈希密码而不是存储它们。

答案 3 :(得分:0)

您可以尝试对内容进行编码/解码。您可以使用MD5哈希功能。有预编写的功能,它的用法非常简单。

以下链接可帮助您了解如何在代码中使用它。 http://www.asjava.com/core-java/java-md5-example/