在我的一个项目中,我有两个字段需要用来存储文件的加密签名(散列),但我只能总共使用112位,在这两个字段中作为16+12十六进制字符扩展。
由于无法存储完整的SHA256,所以我打算使用截断的SHA256值。考虑到28个十六进制字符的约束,下列哪一种方案在密码学上是“最安全的”?
( a)将完整的SHA256截断为28个十六进制字符,并将结果作为连接值存储在这两个字段(16+12)中。
( b)将一个完整的SHA256截断为16个字符,并将结果存储在longer字段中,然后生成原始的完整SHA256哈希的另一个SHA256,将其截断为12个字符并将其存储在较短的字段中。
( c)将完整的SHA256截断为16个字符,并将结果存储在较长的字段中,并为资源生成另一个密码散列(BLAKE2、RIPEMD256,不管是什么实体),将其截断为12个字符,并将其存储在较短的字段中。
非常感谢您的回复。
发布于 2020-11-27 19:53:48
最终,这个方案并不是特别安全,因为,正如kelalaka所指出的那样,这不能提供足够的十六进制字符安全性。
如果您可以在这些字段中存储任意二进制文件,我将为此使用SHA3-224或BLAKE2b-224散列,因为它将能够将整个东西存储在那里。沙-224( SHA-2变体)也可以,如果你确定你的应用程序不需要明显抵抗长度扩展攻击。
如果不能存储任意二进制文件,那么我会将其存储在Ascii85 (没有开始标记和结束标记)或base64url编码(如果可能的话)中,以便从编码字符中获取尽可能多的字节。在本例中,我使用BLAKE2b,因为它可以被具体截断成任意数量的字节,尽管SHA-512/t也是一种可能性。不过,在主要的密码库中,很难找到后者作为通用函数。您可以在这里使用截断函数,但最好使用长度完全正确的散列。
我会坚持对这里的主要数据采用一种强算法,而不是将其分割成多个算法。我不认为使用多个算法可以获得任何结果,SHA-2、SHA-3和BLAKE2b都被认为是健壮和强大的。最终,您的目标是提供尽可能多的比特来抵抗规范的攻击,没有理由认为散列哈希提供了更好的完整性。
我肯定不会在任何新的应用程序中使用MD5或SHA-1。当涉及到碰撞时,人们知道它们有很大的弱点,当你截断它们的时候,情况也不会更好。通常,除非您从知名的密码专家那里得到建议,您应该在一个新的应用程序中使用MD5或SHA-1,否则不应该使用。即使您不需要加密安全性,另一个选项也更好。
https://security.stackexchange.com/questions/241364
复制相似问题