用密文覆盖明文文件

时间:2014-10-19 18:37:20

标签: java encryption file-io

我有这个加密文件的功能,加密位似乎正在工作,但我不能让它覆盖当前文件。

    FileInputStream inputStream = new FileInputStream(input); // Selects file to encrypt

    cipher.init(Cipher.ENCRYPT_MODE, secret, ivSpec); // Sets up the encryption  

    // Creates an the output stream, the encryption is performed here           
    CipherOutputStream cos = new CipherOutputStream(new FileOutputStream(input + ".secure"), cipher);

    byte[] block = new byte[8];
    int i;

    while ((i = inputStream.read(block)) != -1) // Reads the file 
    {
        cos.write(block, 0, i); // Writes the new file
    }

    cos.close();

这样工作正常,我最终得到一个加密文件original_file_name.txt.secure,但我希望它覆盖原始文件。如果我删除了.secure位,它就不能正确写入文件。

如何使用加密文本覆盖文件原始文件?

1 个答案:

答案 0 :(得分:1)

如果您删除了.secure部分,那么您将尝试在写入文件的同时阅读该文件。这不是一个好主意......

最好的方法是在您完成后完成,然后如果一切顺利,您可以使用Files.move()删除原始文件并重命名旧文件以匹配其名称。< / p>

事实上,如果您将正确的选项传递给Files.move(),则可以让它覆盖现有文件,这意味着您不需要首先删除原始文件。

这解决了您所拥有的同时读/写问题,但对于像这样的应用程序来说它也更加安全。如果您的应用程序崩溃或在加密过程中出现断电,并且您正在加密,那么您就完全搞砸了。如果你这样做,那么中间的电源故障仍然会让你的旧文件保持原样。在完整的新文件准备好之前,您将始终拥有完整的旧文件。

顺便说一下,您也应该使用BufferedInputStream,而不是仅仅使用原始FileInputStream。我无法在任何地方看到inputStream.close()