Java 加密和压缩文件名

Java 加密和压缩文件名,java,file,encryption,file-io,hash,Java,File,Encryption,File Io,Hash,比如说,我有一个文件,里面有一个物体的信息。我用一个名称创建它,这样文件名本身就包含关于对象的某些信息,比如对象Id、对象父Id、一些其他元Id信息和文件序列号。之所以这样做,是因为文件在不同的模块中可用,并避免了对文件元信息的多个数据库访问 filename=“OB”+fileId+parentId+metaId+sequence+“.txt” 序列从00001开始到99999(也可能非常大) 因此,每个索引中的每个数字都有特定的含义 现在,文件信息将提供给我们应用程序之外的程序,我不想让其他

比如说,我有一个文件,里面有一个物体的信息。我用一个名称创建它,这样文件名本身就包含关于对象的某些信息,比如对象Id、对象父Id、一些其他元Id信息和文件序列号。之所以这样做,是因为文件在不同的模块中可用,并避免了对文件元信息的多个数据库访问

filename=“OB”+fileId+parentId+metaId+sequence+“.txt”

序列从00001开始到99999(也可能非常大)

因此,每个索引中的每个数字都有特定的含义

现在,文件信息将提供给我们应用程序之外的程序,我不想让其他应用程序知道我使用的详细信息。因此,我考虑在发送文件之前对文件名进行加密或散列,文件中的响应文件名也会加密或散列,他们将根据文件内容向我发送一个带有加密/哈希响应文件名的响应

有两个挑战:

  • 这是在不涉及数据库的情况下实现这一点的最快、最简单的方法

  • 文件名的长度约为25个字符(带有其他id和序列信息),因此我希望生成的文件名更小(尽可能小)且为标准大小


  • 或者可以使用的任何替代机制???

    选项1哈希值

    使用加密散列算法(如SHA-256或SHA-128)会使文件名变长,虽然可以很好地保证文件名是唯一的,但没有任何保证(所有散列算法都会遇到生日悖论)

    由于无法保证SHA-256或SHA-128将生成唯一的文件名,因此根据您需要的安全级别,您可能需要查看Adler32。这个算法不会像SHA家族那样安全,主要是因为产生的散列大小非常小,你可以很容易地强制它。但是,Adler32可以提供文件名的模糊处理

    由于Alder32的结果散列大小很小(32位),因此发生冲突的可能性也比SHA系列高得多,因此您肯定需要保留某种表,其中包含您的文件名及其相应的散列值(在这种情况下或SHA情况下建议这样做)。该表可以是存储在缓存中的简单列表,但主要原因是,如果发生冲突,则需要更改值以计算新的哈希

    选项2加密


    加密不会使数据变小,充其量是相同的大小(如果数据大小可以被算法的块大小平均整除)。但是,它将保留所有数据,而不需要保留一个包含加密值的表。如果你决定使用加密而不是散列,我会使用AES,因为这是现在的标准。加密文件名的数据量非常小,您可能不会注意到算法之间的任何差异,但如果您有足够的妄想症,您可以查看计算机上的AES指令集

    选项1哈希

    使用加密散列算法(如SHA-256或SHA-128)会使文件名变长,虽然可以很好地保证文件名是唯一的,但没有任何保证(所有散列算法都会遇到生日悖论)

    由于无法保证SHA-256或SHA-128将生成唯一的文件名,因此根据您需要的安全级别,您可能需要查看Adler32。这个算法不会像SHA家族那样安全,主要是因为产生的散列大小非常小,你可以很容易地强制它。但是,Adler32可以提供文件名的模糊处理

    由于Alder32的结果散列大小很小(32位),因此发生冲突的可能性也比SHA系列高得多,因此您肯定需要保留某种表,其中包含您的文件名及其相应的散列值(在这种情况下或SHA情况下建议这样做)。该表可以是存储在缓存中的简单列表,但主要原因是,如果发生冲突,则需要更改值以计算新的哈希

    选项2加密


    加密不会使数据变小,充其量是相同的大小(如果数据大小可以被算法的块大小平均整除)。但是,它将保留所有数据,而不需要保留一个包含加密值的表。如果你决定使用加密而不是散列,我会使用AES,因为这是现在的标准。加密文件名的数据量非常小,您可能不会注意到算法之间的任何差异,但如果您有足够的妄想症,您可以查看计算机上的AES指令集

    值得指出的是,散列函数是不可逆的(除非它们是好的,可以用蛮力实现)。这意味着文件名中包含的数据将丢失,除非在将哈希链接到原始文件名的某个位置维护单独的记录。您是正确的,但是假设哈希是原始文件名,没有任何更改,将该文件名放在您的一端就足以重新生成哈希值。我们仍然需要单独记录的原因是,如果发生冲突,您需要某种机制来区分一条记录和下一条记录。但从理论上讲,与SHA-256或SHA-128等更大的哈希算法发生冲突的可能性非常小。值得指出的是,哈希函数是不可逆的(除非它们是好的,通过暴力)。这意味着文件名中包含的数据将丢失,除非保留单独的记录