Java 如何将文件标记为已加密

Java 如何将文件标记为已加密,java,encryption,Java,Encryption,我正在尝试为教育用Pourpues实现一个简单的加密实用程序,它至少对简单文件有效,但当我成功加密一个文件时,我不想再次加密,因为如果我以错误的方式加密/解密数据,可能会导致数据丢失。。。有没有办法阻止我这么做 我使用的是java和默认的加密库 提前感谢由于该文件已加密,因此无法在该文件类型的默认程序中打开,因此您可以保存重命名该文件。例如,可以通过添加.enc作为扩展名来实现。这样做可以很容易地为您和您的java应用程序发现加密文件 根据您的用例,您还可以让java应用程序管理加密文件的数据库

我正在尝试为教育用Pourpues实现一个简单的加密实用程序,它至少对简单文件有效,但当我成功加密一个文件时,我不想再次加密,因为如果我以错误的方式加密/解密数据,可能会导致数据丢失。。。有没有办法阻止我这么做

我使用的是java和默认的加密库


提前感谢

由于该文件已加密,因此无法在该文件类型的默认程序中打开,因此您可以保存重命名该文件。例如,可以通过添加
.enc
作为扩展名来实现。这样做可以很容易地为您和您的java应用程序发现加密文件


根据您的用例,您还可以让java应用程序管理加密文件的数据库。

您想知道的答案在很大程度上取决于您首先如何加密文件

不过,我会列出一些可能对您有所帮助的不同方法

方法1-脚本 如果您使用第三方工具,如另一个java程序员编写的encryption util,并且您在某种shell会话中运行此工具,那么最好将所述工具的调用封装在shell脚本中

如果您在windows上运行,这可能是一个批处理文件,在Linux上可能是一个bash脚本

基本上,您使用这种方法是通过提前计算出需要使用的命令,然后将该命令放入所述shell脚本中,同时替换需要更改的任何参数

在wrapped命令之后,您可以提供进一步的命令来重命名文件,或在文件属性或文件名中嵌入某种信息,可能的示例如下:

IF NOT EXIST %%0.encrypted(
  encrypt %%0 -a -b -c -d
  rename %%0 %%0.encrypted) ELSE (
)
ELSE
()
注意:这些只是理论上的例子,因为我不知道你的操作系统是什么

如果这是保存在一个名为“myencrypt.bat”的文件中,那么您只需键入

myencrypt.bat afile.ext
方法2-自定义字节 如果您可以直接控制源代码以及执行此加密的应用程序,那么为什么不制作一个伪文件格式呢

在程序检查的文件中添加某种标记

举个例子,你也许可以

将以下字符串添加到文件的前面

ENCFOriginalFile.Ext
将其转换为一组字节,然后加载文件,对其进行加密,添加文本中的字节,然后将其保存回,可能使用自定义文件扩展名

再次加密文件时,只需读取前4个字节,如果它们等于ENCF,则知道文件已加密


这只是我脑子里能想到的两个想法,但现在已经很晚了,我很累了。如果我更清醒的话,我可能会写满一整页。

你为什么要再次加密它?我的意思是,你想避免什么样的情况,否则就没有意义了。你是否创建了自己的应用程序来加密这些文件?或者您正在使用第三方工具?假设您试图避免的情况是,每次在文件夹上运行加密时,它只会拾取文件夹中的每个文件并再次加密?@shawty是的,就是这样,我们的想法是避免拾取已加密的文件一次again@EdwinDalorzo我会错误地再次加密该文件。。。因为这是一个cliutility@jaxkodex-在这种情况下,我的答案中的情景1可能适合您。我不能给你一个确切的答案,因为这取决于你的操作系统,但创建某种shell/命令脚本来为你实现过程自动化应该并不困难。我如何保持这个工具的可移植性,这样我就可以把jar带到任何我想用java的地方使用它,我想我可以使用sqllite数据库,但我必须始终使用该数据库。我想把文件移到一个新的扩展名是最好的办法。但是我必须删除上一个。数据库可以和你的加密文件一起保存在一个隐藏的文件夹中。是的,在这种情况下,您必须删除上一个。根据要加密的文件的大小,您可能无法就地加密数据,因为这需要将文件完全读入内存。就地加密并不容易,但其优点是您不需要真正安全地擦除未加密的文件。我更喜欢第二种方法,如果我将结果从tmp(加密)文件移动到原始文件,使用文件流覆盖它,我如何添加这些位。如果您打开了一个流(请记住,我现在很少使用Java:-))那么最好的方法就是打开第二个流进行输出。理论上,您可以打开一个流,写入表示头的字节,然后在tmp文件上打开第二个流,然后将第二个流通过管道传输到第一个流中。至于在加密应用程序启动时检查文件,它只是前四个字节,所以你不需要真正的流,你可以读取一个32位整数,然后再次关闭文件。如果你不能控制源,那么TBH我不确定你可以怎么做。我知道,在windows下,您可以执行“复制/b file1+file2 file3”,即在二进制级别将file1和file2连接起来,并将结果保存在file3中,但您仍然需要以某种方式生成标头。