其基本思想是,对于迭代哈希函数,能够发现哈希冲突n特定的散列值允许您生成2n输入所有散列到相同的值。那是2n第二个哈希函数中的冲突候选项,仅用于查找工作n第一个哈希函数中的哈希冲突——换句话说,很多候选项却只做很少的工作。本文还检查了将散列值连接到输入、重散列以及连接两个输出,发现它们受到相同的攻击。使用设计为256位的哈希比从128或160位哈希中构造一个要聪明得多。
大多数程序员不会尝试发明或修改密码加密算法,但对于加密散列函数还没有同样的谨慎意识。如果您仍然决定这样做,请仔细阅读整个“多重碰撞”论文,检查您的方案是否在“应用密码学”中有描述,并尝试让密码学家检查您的设计。
总之,密码散列对程序员来说最重要的特点是,它们的计算成本比普通散列高得多,而且抗碰撞属性不是不变的,而是随着时间的推移而降低。
什么时候是基于内容的解决方法?
既然我们有了必要的背景知识,我们就可以探索解决方案空间,并找出什么时候基于内容的寻址是一个优势。简而言之,当CBA提供了一些优势(更简单的代码、更好的性能、改进的安全性),并且可以免受蓄意攻击,或者在受到攻击时可以安全地升级为新的加密散列函数时,它是有意义的。
使用CBA会带来一些好处吗?
第一个要问的问题是如果CBA为特定应用程序赋予一些优势 - 它是否会降低代码复杂性或提高性能,或者它会使事情变得更糟吗?我已经阅读或听到了一些关于一些使用CBA的故事,实际上使系统变得越来越糟糕 - 减慢磁盘缓存,试图仅在散列的成本大于I / O或计算时将修改的内存写入磁盘。或计算几乎总是不同的数据的加密障碍,无论如何都必须转移。值得做一些高级别的审查和信封后备计算的时间,以了解基于CBA的实施是否可能会得到回报。
减少代码复杂性
代码复杂性的减少通常是CBA的主要好处。使用库提供的加密散列函数通常更简单,并比较结果,而不是为特定用例进行优化的完整哈希表实现,或者跟踪数据的更改。
提升的性能
CBA的基本性能代价是计算数据的加密散列、比较散列(包括在必要时在同一位置获得两组散列),以及传输或存储任何更改的数据。使用CBA获得的好处必须大于这些代价,但这种权衡取决于更改了哪些部分的数据、IO通道的带宽、散列的大小,以及是否可以计算一次散列并多次重用。请注意,有些应用程序出于安全原因需要对数据进行加密散列,例如不完全信任存储节点的安全分布式文件存储。在这种情况下,散列的计算成本是无关的。
数据变化部分:CBA的性能很大程度上取决于数据的不同百分比。让我们先看一些简单的例子。最简单的情况是数据总是不同。在这种情况下,计算散列是一种不必要的开销,只有在存在一些令人瞩目的安全威胁时才应该包括在内。下一种最简单的情况是数据始终相同。在这种情况下,比较纯粹是计算、传输和比较散列所需的时间与传输整个数据所需的时间之间的比较。如果要比较的数据在本地内存中,直接比较肯定要比每512位运行80轮计算快。如果要比较的数据在本地磁盘上,则直接比较或使用传统的哈希表可能更有利,这取决于磁盘带宽和CPU速度的比率。如果比较的数据位于共享的低带宽卫星链路的两端,CBA无疑是赢家。从概念上讲,比较是在哈希函数的“带宽”——它每秒可以处理多少字节——和正在比较的两个数据之间的I/O链路(内存总线、I/O总线、网络链路)的带宽之间进行的。 The method with more bandwidth is likely to be better.
复杂(共同)情况下的数据在一定程度上改变,哈希函数的带宽比I / O的带宽链接,权衡点取决于数据改变的百分比和散列的相对带宽和I / O(和在一个小得多的程度上,散列的大小输出)。在大多数情况下,经过几分钟的手工计算后,在某个方面会有明显的优势——只需计算散列带宽、I/O带宽,并为数据更改百分比选择一些合理的值。如果您想要更花哨,可以考虑通过I/O链接传输散列的成本。
测量带宽:找到哈希函数和I/O链接的带宽比以往任何时候都容易。OpenSSL库有一个内置的基准命令:
美元openssl速度
从我的笔记本电脑选择输出:
所选哈希函数的带宽(KB/s) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
哈希 | 16字节的输入 | 64字节的输入 | 256字节的输入 | 1024字节的输入 | 8192字节输入 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MD2 | 858.46. | 1789.04 | 2515.67 | 2797.48 | 2927.39 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MD4 | 7991.10 | 28268.68 | 76263.37 | 141054.08 | 185523.89 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MD5 | 7002.36 | 23954.07 | 68119.32 | 124396.91 | 168473.60 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ripemd - 160 | 5758.02 | 16670.98 | 37134.21 | 52536.75. | 59553.02 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sha - 1 | 6860.21 | 21475.32 | 52002.86 | 81293.41 | 97357.06 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sha - 256 | 4256.00 | 9803.35. | 18622.66 | 23416.18 | 25162.76 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sha - 512 | 2499.55 | 10173.91 | 18949.99 | 28710.90 | 33324.71 |
邦妮+ +或一个简单的Cat文件> /dev/null会找到当地硬盘的带宽,Netperf.将报告您的网络带宽。请确保选择正确的块、文件或包大小进行评估,因为带宽根据正在处理或传输的数据元素的大小变化很大。
哈希的长期存储:CBA经常用于存储系统的寻址和重复数据删除。在这种情况下,当数据第一次存储和重用多次时,计算散列值一次,因此计算散列值的成本在许多操作中分摊。同时,存储散列将增加代码复杂性,降低了CBA的一个好处。
替代方案评估:有时,更普通的方法,如传统散列表、传统差异、源代码控制系统和压缩,会被忽略,因为它们实际上的性能比CBA更好。计算一个非常便宜的散列,然后比较整个数据中任何有散列冲突的内容,这比计算一个昂贵的加密散列要快。同样,另一种策略是使用一系列逐步增强的散列,例如在第一个阶段中使用的滚动散列rsync.跟踪两个版本之间的差异(而不是完全无状态的方法)并只发送这些差异是另一个传统的选择。除了众所周知但有限的diff工具,xdelta计算任何格式的文件之间有效的差异。压缩可以改变等式的两侧,这取决于压缩的“带宽”与I / O带宽之间的比率。同样,一点手计算通常会快速确定最快的算法。
一个说明性的例子是rsync,远程文件同步程序。在本地和远程主机之间同步文件时,rsync默认使用CBA。但是,当要同步的文件位于类似于本地文件系统的地方rsync(如/home/val/src/),它将发送整个文件,而不是只查找和发送文件中更改的部分。这种启发式通常是正确的,但有时会被真正的高带宽网络或真正的低带宽磁盘所欺骗。的手册页rsync:
-W,——whole-file这个选项不使用增量rsync算法,而是按原样发送整个文件。如果在源机器和目标机器之间的带宽高于到磁盘的带宽(特别是当磁盘实际上是一个联网的文件系统时)时使用此选项,传输可能会更快。当源路径和目的路径都被指定为本地路径时,这是默认值。