java - 加密和压缩文件名

标签 java file encryption file-io hash

假设,我有一个包含对象信息的文件。我使用名称创建它,以便文件名本身包含有关对象的某些信息,如对象 ID、对象父 ID、一些其他元 ID 信息和文件序列号。这样做是因为文件可在不同的模块中使用,并避免对文件的元信息进行多个数据库访问。

文件名=“OB”+fileId+parentId+metaId+序列+“.txt”

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

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

现在,文件信息可供我们应用程序外部的程序使用,我不希望其他应用程序知道我使用的详细信息。因此,我正在考虑在发送文件之前使用文件名加密或散列,文件中的响应文件名也进行加密或散列,并且他们将根据文件内容向我发送带有加密/散列响应文件名的响应

有 2 个挑战:

  1. 不涉及数据库的最快、最简单的方法

  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/

相关文章:

java - 如何防止在另一个线程的静态调用上创建对象副本

带有 LWJGL 的 JavaApplet 在更新到 7u45 后损坏

java - 读取文本文件方法

javascript - 公共(public)Webapp的访问控制或加密

java - 如何将完整的堆栈跟踪写入日志?

java - MVVM 在多个存储库中重复代码

objective-c - iOS:在c代码中获取文件路径

java - 如何找出 FIles.isWritable() 在 Windows 上返回 false 的原因

使用 libsodium 加密

swift - 从 NSData 到 Swift 2 中的 SecKeyRef