为了实现数据完整性,特别是针对小块数据,而不是使用SHA-256散列,或者只是截断SHA-512哈希,我使用以下方法:
function saferHash(data) {
let hash1Entropy = 42; // sha512:42
let hash2Entropy = 4; // 4B extra possible protected outcomes in case of highly unlikely collision in hash 1
const hash1 = sha512(data).slice(0,hash1Entropy); // for 42 byte entropy, truncated to save space + prevent length extension vulnerabilities
const hash2 = blake3(data).slice(0,hash2Entropy); // cheapest extra forgery prevention in case of sha512:42 hash collision, truncated to save space + prevent length extension vulnerabilities
return new Uint8Array([...hash1,...hash2]); // 46 byte total hash
}这是否完全超出了整个系统的设计,或者将熵增加到+32字节,并使用额外的廉价哈希函数(blake3)来增加创建冲突的难度,这是不是太糟糕了?
发布于 2022-07-05 20:17:41
发布于 2022-07-05 19:34:44
通过截断散列,您实际上增加了每个哈希的碰撞率。
最终,对于一定数量的字节,并且考虑到算法是静态的,并且是相对安全的(通过具有接近均匀的输出),碰撞率将大致保持不变。
你唯一能阻止的可能是彩虹--如果一个特定的散列存在的话,那么大多数都不会因为你的组合而存在。
我相信这是完全的工程,它是更安全,更方便和绝对更快充分使用沙-512比截断每一个和重新发明车轮。
简单地说,你是在截断一个更慢更好的算法,减少你从它得到的“好的”熵,用一个“更便宜”的算法代替它。
发布于 2022-07-05 23:30:28
散列的大小取决于您预期的加密需求。我们预计128位安全足以应付未来的无限期.因此,32字节(256位)散列对于经典密码来说应该是很好的.但是,如果您需要在后量子密码系统中生存下来的抗碰撞能力,则建议使用更长的哈希(384位或更多)。
我的建议是避免混合和匹配散列,因为并不总是增加额外的安全性就像您认为的那样。与混合和匹配散列相比,更好地使用单个强散列的输出。这也使密码分析结果更容易跟踪,因为它的结构简单和标准。类似地,如果您的代码出于任何原因需要进行审核,那么简单地说“我正在使用这个标准哈希算法”就更容易了,然后向审计师解释您为什么选择自定义构造。
一般来说,任何一种具有足够大小的SHA-2或SHA-3算法或BLAKE2都是很好的选择。BLAKE3也可能是一种选择,但它所看到的密码分析较少,并且与随机预言不同。如果您想要一个非常快的选项,BLAKE2b比MD5和SHA-1更快,并且是加密安全的,并且它可以配置为提供最多512位的任何输出大小(尽管有些实现只提供这个大小)。您可以截断一个算法,但我建议您选择一个满足适当输出大小的算法。
如果您真的担心密码学的发展,您可以使用像多散列这样的格式来存储您的数据,然后,如果将来有必要,只需转换到一个新的函数。
https://crypto.stackexchange.com/questions/100872
复制相似问题