压缩SHA-256哈希

4
我希望能够自动生成 Java 的 serialVersionUID(一个长整型,即64位)。确定要序列化的对象的方法基于大约20个整数,但并不总是20个整数。我打算将这些整数转换为逗号分隔的数字字符串,并通过 SHA-256 哈希函数进行处理。
由于 SHA-256 是32字节长(256位),而我需要它适合 serialVersionUID(64位),因此我应该如何将其转换为64位值并最小化损失好哈希的特性?

你是否知道“serialver”工具?你是否知道serialVersionUID不必在每个类中都是唯一的? - user207421
我知道类的版本不需要是独特的。我不需要每个类的版本都是独特的。我使用 serialVersionUID 是因为我想控制兼容性,但我也可以自动化它。这样,我保留了控制权并消除了出现人为错误的风险。 - H2ONaCl
5个回答

5

只需剪掉多余的部分,没有必要把事情搞得复杂化。如果有比仅取前64位(或任何其他位)更优秀的方法,那么哈希本身就被破解了。


3
首先,通常情况下不太可能压缩好的哈希。压缩是指一种可逆编码,用于减少冗余。在一个好的哈希中应该没有可以减少的冗余,因此压缩将无效。
由于SHA-256长度为32字节(256位),而需要将其转换为64位的serialVersionUID,那么如何将其转换为64位值并尽量减少好哈希特性的损失?
那么,好的哈希有哪些特征呢?好的哈希的主要特征是它难以被反转;即难以找出可能导致哈希的输入。相关特征是,在给定产生给定哈希的已知输入的情况下,难以生成另一个输入(即碰撞)以给出相同的哈希。
现在,当您从256位哈希转换为64位哈希时,您使得通过暴力破解更容易反转哈希或产生哈希碰撞。基本上,64位哈希意味着任何随机输入都有2 ^ 64的概率具有给定的哈希。这个概率足够大,以至于拥有足够核心的“坏人”有足够的成功机会(在合理的时间内)使暴力破解成为一个合理的选择。
但这真的很重要吗?通过创建与serialVersion字符串冲突的字符串,有什么好处呢?这些字符串不是秘密,它们也不能为您提供有关对象API的任何确定性信息...
总之,如果这些缩小的哈希用作serialVersion字符串设计的用途,那么在(例如)仅使用SHA-256哈希的前64位时将不会有任何问题。没有必要进行XOR、校验和或任何其他更复杂的转换。

这里有很多好的观点,还有一个关于使用“压缩”一词的好观点。 - H2ONaCl

1
您可以计算SHA-256摘要的循环冗余校验(CRC)。

0

我建议使用64位校验和,或者如果您想继续使用SHA,则对64位块进行异或操作。


0

使用ripemd-160进行哈希。

例如,

4727c1278432c388eea822904f008468c02fd543fc347391d1f2b9918ec9b5b9

会变成

069e298ee9d1b14e7774434624703c0be1a47ee1

那是66个字符,缩减到40个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接