假设,我有一个包含对象信息的文件。我使用名称创建它,以便文件名本身包含有关对象的某些信息,如对象 ID、对象父 ID、一些其他元 ID 信息和文件序列号。这样做是因为文件可在不同的模块中使用,并避免对文件的元信息进行多个数据库访问。
文件名=“OB”+fileId+parentId+metaId+序列+“.txt”
序列从 00001 开始到 99999(也可能非常大)
因此,每个索引的每个数字都有特定的含义
现在,文件信息可供我们应用程序外部的程序使用,我不希望其他应用程序知道我使用的详细信息。因此,我正在考虑在发送文件之前使用文件名加密或散列,文件中的响应文件名也进行加密或散列,并且他们将根据文件内容向我发送带有加密/散列响应文件名的响应
有 2 个挑战:
不涉及数据库的最快、最简单的方法
文件名长约 25 个字符(带有其他 ID 和序列信息),因此我希望生成的文件名更小(尽可能小)并且具有标准大小。
或者任何可以使用的替代机制???
最佳答案
选项 1 哈希
使用 SHA-256 或 SHA-128 等加密哈希算法将使您的文件名更长,尽管可以很好地保证文件名的唯一性,但无法保证这一点(所有哈希算法都会遇到生日悖论)。
由于无法保证 SHA-256 或 SHA-128 会生成唯一的文件名,并且根据您需要的安全级别,您可能需要查看 Adler32。该算法不会像 SHA 系列那样安全,主要是因为生成的哈希值非常小,您可以很容易地对其进行暴力破解。然而Adler32可以提供文件名的混淆。
由于 Alder32 生成的哈希大小很小(32 位),因此发生冲突的可能性也比 SHA 系列高得多,因此您肯定需要保留某种包含文件名及其相应哈希值的表(在这种情况或 SHA 情况下建议使用)。该表可以是存储在缓存中的简单列表,但主要原因是,如果发生冲突,您将需要更改值来计算新的哈希值。
选项 2 加密
加密不会使您的数据变小,最多会保持相同的大小(如果您的数据大小可以被算法的 block 大小整除)。但是,它将保留所有数据,而不需要保留加密值的表。如果您决定使用加密而不是哈希,我会使用 AES,没有其他原因,因为这是当今的标准。加密文件名的数据量很小,您可能不会注意到算法之间的任何差异,但如果您足够偏执,您可以查看 Intel CPU's 上的 AES 指令集。 。
关于java - 加密和压缩文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14018971/