关于基于内容寻址的加密散列的代码猴子指南

123.4 第3页
第3页,共4页

其基本思想是,对于迭代哈希函数,能够发现哈希冲突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算法,而是按原样发送整个文件。如果在源机器和目标机器之间的带宽高于到磁盘的带宽(特别是当磁盘实际上是一个联网的文件系统时)时使用此选项,传输可能会更快。当源路径和目的路径都被指定为本地路径时,这是默认值。
123.4 第3页
第3页,共4页
工资调查:结果已经出来了