当新人在学区块链技术的时候, 都会听到哈希和哈希算法, 这似乎是无处不在的安全性保证. 例如比特币或者以太坊这种运行去中心化网络和共识的机器, 都会有上万个节点通过 P2P 连接, 并且需要 "无需可信" 和可验证的效率. 这些系统需要将信息写入紧凑的格式, 从而通过参与者进行保证安全和快速验证.
比特币和以太坊主要的 primitive 是区块的 notion, 这是包含转账信息, 时间戳和其他重要数据的数据结构. 他们安全性的重要部件, 就是能够压缩网络全部的状态信息, 变成很短, 并且标准的信息, 在需要的时候可以进行有效验证, 这就被称之为哈希.
到处都会使用加密哈希, 从密码存储到文件验证系统. 使用确定性算法的基本原理, 就是使用一个输入, 并且每次都产生一个固定长度的字符串. 也就是说, 使用同样的输入总是会导致同样的输出.
确定性不仅对哈希很重要, 而且可以改变输入的单个字符会产生完全不同的哈希.
哈希算法的问题是碰撞 (collisions) 的必然性. 哈希是固定的字符串, 意味着对于每个输入, 不同的输入都会产生同样的输出. 碰撞 (collisions) 是不好的. 这意味着如果有攻击者能够根据需求创建这种 collisions, 那么他就可以让欺诈文件或者数据看起来像正确的, 合适的哈希, 并且冒充合法. 优质哈希功能的目标是让攻击者很难找到, 获得输入数据的方法.
计算哈希不应该太简单, 因为这会让对于攻击者来说, 计算 collisions 也变得很容易. 哈希算法需要对 "预攻击" 有抵抗性. 也就是说, 给定哈希, 应该很难计算追溯确定性的步骤来重新产生由哈希创建的数值.
Given s= hash(x), finding x should be near impossible.
概括来看,"好的" 哈希算法会有以下 3 种特性:
- 在输入中改变一个字符, 应该会创建雪崩效应, 从而导致完全不同的哈希
- 很低的概率会产生 collisions
- 提高效率, 但是不会牺牲 collision 的对抗性
破散哈希
其中一个初始哈希算法标准是 MD5 哈希, 这是被广泛用来进行文件整合验证, 而且存储哈希密码在网页应用数据库. 这个功能非常简单, 因为输出是固定的, 128 个字符串对于每个输入, 并且使用几轮微不足道的单向运算来计算其确定性输出. 它的输出长度短, 操作简单, 使得 MD5 彻底易碎, 被称为生日攻击.
"生日攻击" 是什么?
我们曾经听过, 如果你把 23 个人放在一个房间, 就会有 50% 的概率, 其中的 2 人会有同样的生日? 将这个数字提升到 70 人在一个房间, 就会有 99.9% 的概率. 这就是我们所说的鸽巢原理, 也就说如果把 100 个各自放到 99 个箱子, 你就必须在 1 个盒子里面放 2 个鸽子. 换句话说, 固定的输出意味着 collisions 可能会找到固定的排序.
其实, MD5 对于 collision 的抵抗是很脆弱的, 家庭使用的 2.4GHz 处理器就可以在几秒钟算出哈希 collision. 而且, 对于现在网页的早期使用, 还可以在网络上创建很多 MD5 的预图形, 如果搜索哈希, 就可以在谷歌上很容易找到.
哈希算法的多样化和革新
开始: SHA1 &SHA2
NAS 被称为哈希算法标准的先驱, 最初的想法是安全哈希算法或者 SHA1, 创建了 160 固定长度的输出. 不幸地是, SHA1 通过增加了输出长度, 单向操作的数量, 还有单向操作的复杂性, 从而形成了 MD5 算法, 但是这不会提供任何基础的提升, 来对抗更有力量的机器来尝试不同的攻击.
我们怎么才能做得更好呢?
进入 SHA3 时代
在 2006 年, 国家标准和技术研究院提出了一个比赛, 来找到 SHA2 的替代, 这在本质上九不同, 从而形成了标准. 因此, SHA3 作为现在所知的 KECCAK 哈希算法一部分, 就这样诞生了.
尽管表面看起来是相同的, SHA3 通过一个被称为海绵结构的机制, 让内部变得非常不同, 这使用了随机的排列来输入和输出数据, 同时也为未来的输入提供了随机的来源, 这会进入到哈希算法中.
SHA3 维持了内部的状态并且有和输出相关的更多信息, 这可以防止之前算法的限制. 在 2015 年, 通过 NIST 成为了标准.
哈希算法和工作量证明
当考虑到整合哈希算法到区块链协议中的时候, 比特币使用了比较旧的 SHA256 算法, 但是以太坊使用了修改后的 SHA3 算法, 作为工作量证明的算法. 选择工作量证明区块链的哈希功能是很重要的部分, 但是计算的效率称为哈希.
比特币 SHA256 算法通过特定的硬件 ASIC, 进行有效计算. 在矿池中, 很多都是在 ASIC 上写入的算法, 但是这也会使得整个协议往中心化计算发展. 也就是说, 工作量证明激励了有效计算机器来聚集成矿池, 同时也增加了哈希力. 或者一种机器可以计算每个时间间隔的哈希数量.
以太坊, 使用的是被称为 KECCAK256 的改进 SHA3. 而且, 以太坊的工作量证明算法, Dagger-Hashimoto 意味着意味着内存难以计算硬件.
为什么比特币使用双重 SHA256 算法?
比特币通过 SHA256 算法, 会有很有趣的方式来获得哈希数据, 因为它会在协议中运行算法的 2 次迭代. 需要注意地是, 这并不是生日攻击的对策, 因为很明显如果 hash(x) = hash(y), 那么 hash(hash(x)) = hash(hash(y)). 但是, 双重 SHA256 算法是被使用来减轻长度扩展攻击.
本质上来说, 这类攻击包括, 恶意欺诈的人知道哈希输入的长度, 可以用来欺骗哈希来开始内部状态的某个部分, 通过附加一个私密字符串到哈希值. SHA256, 是 SHA2 算法大家庭中的一个, 逃离这个陷阱, 比特币通过计算哈希两次来减轻它.
以太坊 2.0 和 BLAKE 算法
SHA3 并不是来自 2006 年 NIST 哈希比赛的唯一突破. 尽管 SHA3 获得胜利, 称为 BLAKE 的算法获得第二. 对于以太坊 2.0 分片技术的部署, 更有效的哈希几乎是个特性要求, 研究团队非常重视. BLAKE2b 哈希算法, 这是 BLAKE 的更新版本, 在和 KECCAK256 算法相比的时候, 它由于效率很高正在被广泛使用, 同时也保证了很高的安全性.
BLAKE2b 的计算速率实际上是比 KECCAK 在现代 CPU 上要快 3 倍.
哈希算法的未来
不论我们怎么做, 我们只能 (1) 提高内部哈希操作的复杂性, 或者 (2) 提高哈希输出的长度, 希望攻击者的计算机不会足够快到能够有效地计算 collision.
我们依赖于网络安全单向操作前图像的模糊性. 也就是说, 哈希算法的安全目标是让所有人尽可能困难地找到能够获得同样哈希输出的数值, 尽管对于可能的 collision, 其数值是有限的.
未来有量子计算机了? 哈希算法还安全吗?
根据现在的理解, 答案是肯定的. 哈希算法将经受量子计算机的考验. 量子计算能够打破的东西, 是严密的, 用巧妙的技巧和理论建立的底层数学架构, 例如 RSA 加密. 另个方面来看, 哈希算法在内部的框架中, 有更少的形式结构.
量子计算机确实加快了计算的速度, 例如哈希算法, 但是最后, 它们也会被利用来进行如同现在计算机的攻击.
不论我们为协议选择了什么算法, 很清楚地是我们都处于有效计算的未来, 而且我们必须要使用最好的方式来获得正确的工具, 以及那些希望能经受时间考验的人.
发文时比特币价格 43249.77
来源: http://www.tuicool.com/articles/MjmYvaE