Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 可以将SHA256哈希值截断为128位吗?_Hash_Md5_Sha256_Sha - Fatal编程技术网

Hash 可以将SHA256哈希值截断为128位吗?

Hash 可以将SHA256哈希值截断为128位吗?,hash,md5,sha256,sha,Hash,Md5,Sha256,Sha,MD5和SHA-1哈希对冲突攻击有弱点。SHA256没有,但它输出256位。我可以安全地获取第一个或最后一个128位并将其用作散列吗?我知道它会更弱(因为它的比特数更少),但否则它会工作吗 基本上,我想用它来唯一地标识文件系统中的文件,这些文件可能有一天会包含一万亿个文件。我知道生日问题,一个128位的散列应该会产生大约万亿分之一的几率,在万亿个文件中,有两个不同的文件具有相同的散列。我能忍受这些困难 我不能容忍的是,如果有人可以很容易地、故意地插入一个具有相同哈希和相同文件开头字符的新文件。我

MD5和SHA-1哈希对冲突攻击有弱点。SHA256没有,但它输出256位。我可以安全地获取第一个或最后一个128位并将其用作散列吗?我知道它会更弱(因为它的比特数更少),但否则它会工作吗

基本上,我想用它来唯一地标识文件系统中的文件,这些文件可能有一天会包含一万亿个文件。我知道生日问题,一个128位的散列应该会产生大约万亿分之一的几率,在万亿个文件中,有两个不同的文件具有相同的散列。我能忍受这些困难

我不能容忍的是,如果有人可以很容易地、故意地插入一个具有相同哈希和相同文件开头字符的新文件。我相信MD5和SHA1这是可能的。

是的,这会起作用


记录在案的是,已知有针对MD5的在用碰撞攻击,但SHA-1攻击在这一点上完全是理论上的(尚未发现SHA-1碰撞)。

但值得吗?如果每个文件都有一个哈希,那么每个文件实际上都有一个开销。假设每个文件必须至少占用512字节(一个典型的磁盘扇区),并且您将这些散列存储得足够紧凑,以避免每个散列占用的空间远远超过散列大小

因此,即使您的所有文件都是最小的512字节,您所说的不是
16/512=3.1%
就是
32/512=6.3%
。实际上,我敢打赌您的平均文件大小更大(除非您的所有文件都是1个扇区…),这样开销就会更小

现在,哈希所需的空间量与您拥有的文件数成线性比例。那额外的空间值这么多吗?即使你有你提到的万亿个文件,那就是
10000000*16=~29tib
,这是一个很大的空间,但请记住:你的数据将是
10000000*512=465tib
。这些数字真的毫无价值,因为它仍然是
3%
6%
开销。但是在这个级别上,如果你有半PB的存储空间,那么15 TB是否重要呢?在任何层面上,
3%
节约意味着什么?记住,如果他们更大,你节省的就更少。(它们可能是这样的:如果硬盘大小为512字节,祝你好运。)

那么,这是
3%
还是更少的磁盘节省值值得承担安全方面的潜在风险呢。(我不回答这个问题,因为这不是我喜欢的。)


或者,您是否可以(比如)以某种逻辑方式将文件分组在一起,这样您就可以拥有更少的文件?(我的意思是,如果你有数以万亿计的512字节的文件,你真的想散列磁盘上的每个字节吗?

是的,那就行了。理论上,将两半部分异或在一起更好,但即使是截断的SHA256也比MD5更强。您仍然应该将结果视为128位散列,而不是256位散列。


在这种情况下,我的特别建议是使用HASH+uniquifier存储和引用,其中uniquifier是您以前使用此HASH看到的不同文件数。这样,如果有人试图为SHA256存储未来发现的碰撞向量,你就不会完全崩溃。

我原以为生日悖论会给出更低的概率,但维基百科同意你的观点:相关问题:另请参见:那么。。。在不含糊地引用维基百科的生日悖论文章的情况下,有人能用简单、相对非技术性的语言总结一下为什么可以截断散列算法的输出吗?如果这是一个好主意,为什么散列算法不能省去麻烦并自动截断呢?换句话说,哈希算法生成的输出保证在算法的参数范围内,对每个输入都是唯一的。实际算法本身能保证前128个字符是唯一的吗?你真的能从一篇关于生日悖论的文章中推断出截断SHA-256的输出是有效的吗?这篇文章讨论了一般的散列,但没有提到截断散列算法输出的效果,更不用说截断任何特定哈希算法的输出的影响了?SHA-256产生256位的结果,是吗?它不输出128位的结果。算法的作者在哪里声明,如果任意丢弃结果的128位,那么您是安全的?就这点而言,被截断的SHA-256比完整的160位SHA-1安全吗?SHA-256(OP正在讨论的哈希)是SHA-2,而不是SHA-1-我想?到目前为止还没有发现SHA-2的碰撞。。甚至理论上都没有。@mrl33t:没有;SHA-1具有理论上的漏洞,但SHA-256(属于SHA-2套件的一部分)甚至没有这些漏洞。考虑到SHA-256散列的大小是SHA-1的2^128倍,并且SHA-2被认为在理论上更安全,因此不太可能很快出现任何SHA-256冲突。2^128倍大?哇我想你可能想检查一下你的数学,或者你的措辞…@Dan:哎呀,我的意思是搜索空间要大2^96倍,对不起(2^96*2^160=2^256)今年早些时候发现了SHA-1碰撞:我找不到任何参考文献表明理论上最好将两部分异或在一起,我对此表示怀疑。关于uniquifier.GregS的有趣想法:一些早期对MD5的攻击导致大部分散列与一个或两个不同的单元格发生冲突。@Joshua这听起来在经验上(而不是理论上)更好。我还对一篇关于为什么XOR更好的参考文献感兴趣。你不需要对两半进行XOR,官方标准说你可以只取最左边的128位(参见)。这并不能真正回答这个问题。是吗?@ALOToverflow:不,不是。但这并不意味着它不相关:有时质疑问题的前提可能导致更好的解决方案