什么是哈希?哈希算法是否能被量子计算机破解

前言哈希算法对于保证区块链网络安全很重要为了减少哈希冲突可能性要么提高哈希内部操作的复杂性要么提高哈希输出的长度寄希望于攻击者计算速度不够快本文分析了哈希算法的历史原理和未来对于我们理解区块链的安全问题很有帮助

新手在了解区块链的时候经常会接触到哈希(hash)和哈希算法(hashing algorithm)这样的概念它们在安全方面可以说是无处不在通过P2P运行像比特币以太坊之类有众多节点的去中心化网络需要去信任机制和验证的高效性

这就是说这些系统需要想办法将信息以一种高效而简洁的方式编码并允许其参与者能够安全而快速的进行验证

什么是哈希

比特币和以太坊所涉及的主要概念是“区块”这是一种包含交易记录时间戳以及其他元数据的数据结构这种数据结构安全性的关键在于它能够将大量关于全球网络状态的信息压缩成一小段信息标准并使这一小段信息能被高效的验证这一小段信息被称为哈希

哈希算法现状——原因、方法及未来

即使仅仅改变输入信息的一个字符也会产生一个完全不同的哈希值!

加密学上的哈希被用于各行各业从密码储存到文件验证系统基本思想是使用一种确定性的算法(deterministicalgorithm),这种算法能够接受一个输入并每次都产生一个长度固定的字符串也就是说一个相同的输入得到的永远都是相同的输出

除了这种确定性哈希算法还有一个特性输入中的任何一点点的改变都会导致输出变得完全不同

哈希算法有一个问题就是冲突必然性(inevitability of collisions)它的意思是由于哈希函数输出的字符串长度一定不同的输入有可能会产生相同的哈希值冲突是不好的如果一个攻击者能够故意产生冲突他便能够把恶意的文件或者数据伪装成正确的哈希值并将其传递下去一个好的哈希函数的目标是让冲突的发生变得几乎不可能

计算一个哈希值不应该太过高效因为这会让冲突的实现变得太过容易哈希算法应该能够抵御“原像攻击(pre-image attack)”也就是说根据已知的哈希值找到输入值应该是极其困难的(输入值被称作原像比如s = hash(x),根据s找到x应该是几乎不可能的)

总结起来一个好的哈希算法应该具备以下特征

  • 改变输入的任意一点都会产生一个完全不同的输出
  • 发生冲突的可能性非常低
  • 在不牺牲抵御冲突的情况下有一定的效率

攻击哈希

最初的哈希算法标准之一是MD5哈希它被广泛的应用于文件完整性验证(校验和)同时在网络应用的数据库中用于储存哈希密码那时它的功能还十分简单因为不论输入如何输出是一个固定的128位的字符串并且它使用并不有效的多轮单向操作(one-wayoperations across several rounds)来计算确定性输出

由于输出字符串长度较短以及操作较为简单MD5很容易被破解并易受生日攻击(Birthday Attack)的侵扰

什么是“生日攻击”?

你可能听说过如果一个房间里有23个人那么两两生日重叠的可能性就有50%而在一个房间内如果提高到70人那么这个概率就变成了99.9%这就是鸽子洞原则(pigeonhole principle)如果有100只鸽子只有99个洞那么必然有一个洞中有两只鸽子

放在哈希算法的案例中就变成了一个固定长度的字符串意味着一个固定的排列组合数量因此当输入值达到一定的数量时冲突必然会发生

哈希算法现状——原因、方法及未来

太多鸽子了!至少有一只鸽子会与另一只共用一个洞

MD5抵御冲突的能力如此之弱以至于一个2.4GHz的奔腾处理器都能在数秒之内制造一次哈希冲突。in fact,由于MD5在较早年代的广泛应用已经有大量的原像在线上泄漏你甚至可以用简单的谷歌搜索来找到它们

多样性和哈希算法的进化

开端SHA1 & SHA2

美国国家安全局(NSA)一直都是哈希算法标准方面的先驱他们最早提出安全哈希算法也就是SHA1这个算法输出的是160位固定长度的字符串

However,SHA1仅仅在MD5的基础上提高了输出的长度单向操作的数量以及单向操作的复杂性但未做任何根本改进来使其能够抵御更强大的机器这些机器尝试不同的攻击向量

那么我们该如何提高呢?

SHA3

在2006年美国国家标准与技术研究所(NIST)发起了一场寻找一个与SHA2从根本上不同的替代品让它成为新的算法标准。therefore,SHA3的诞生是哈希算法伟大机制的一部分它被称为KECCAK

虽然名字看上去差不多SHA3内部与之前的算法完全不同因为它拥有海绵结构(Sponge Construct)机制这种结构使用随机的排列组合来吸收和输出数据同时还能为未来输入值提供随机源

哈希算法现状——原因、方法及未来

KECCAK256海绵结构作用于输入值

SHA3维持一个内部状态使得输出信息比字符串长度长(依然能够做到对于信息的压缩)这使它克服了先前算法的局限性它也在2015年成为了NIST的标准算法

哈希和PoW

当哈希算法被集成到区块链协议中的时候更老一些的比特币选择了SHA256算法而以太坊选择了改良版的SHA3(KECCAK256)作为PoW的算法一个在区块链PoW协议中选择哈希函数的重要标准是计算哈希值的效率

对比特币SHA256算法的执行效率可以通过制造诸如ASICs矿机之类的专门硬件来进一步提高这表现在矿池中ASICs的使用并使协议趋向于计算中心化

也就是说PoW鼓励高效的计算群体聚合成更大的群体(矿池)从而提高我们所说的哈希算力(也就是一个机器在固定的时间间隔能够计算的哈希数量)

以太坊选择了改良后的SHA3也被称作KECCAK256。also,以太坊的PoW算法(Dagger-Hashimoto)设计成硬件内存难以计算这从一定程度上避免了ASICs矿机的使用

为什么比特币要使用双重SHA256?

比特币使用SHA256来转换数据的方式很有趣它将算法在协议中连续执行了两次注意这并不是为了抵御生日攻击显然如果hash(x) = hash(y) 那么也有hash(hash(x)) = hash(hash(y)),而是为了缓解长度扩展(length-extension)攻击

从本质上说这种攻击需要恶意攻击者知道哈希输入值的长度在这个已知的长度上再加上一个秘密的字符串就可以发动哈希函数内部的一部分从而扰乱哈希函数由于SHA256是SHA2算法家族的成员它有这一类的短板而比特币通过将哈希函数连续运行两次来缓解这个缺陷

以太坊2.0和BLAKE

SHA3并不是NIST在2006年发起的那场竞赛中唯一的突破虽然SHA3最终获胜一个叫做BLAKE的算法紧随其后位居第二对于以太坊2.0分片的执行更高效的哈希算法可以说是必不可少的

BLAKE2b哈希算法是一个在竞赛之后被高度升级优化过的版本由于在保持高度安全性的同时拥有极高的效率(跟KECCAK256相比)这个算法也经历了较为彻底的测试

在一个现代CPU上计算BLAKE2b实际上比KECCAK要快3倍

哈希算法的未来

看起来无论我们做什么要么是在

(1)提高哈希函数内部操作的复杂性

(2)提高哈希输出的长度寄希望于攻击者的计算机由于速度不够快而无法有效产生计算冲突

我们网络的安全性目前依赖着单向操作原像的模糊性也就是说一个哈希算法的安全目标是让任何人找到具有两个相同输出的值变得越难越好从而使得哈希冲突的可能性尽可能的小虽然依旧存在无限数量的可能的冲突

那么量子计算呢?哈希算法能被量子计算机破解么

根据目前的理解简单的回答是:Safety。哈希算法将能够经受量子计算的挑战量子计算能够破解那些诸如RSA加密问题这些问题具有严格的底层数学结构它们由巧妙的技巧和理论构建而哈希算法内部构造中并没有那么正式的结构

量子计算机确实可以加快计算非结构化问题(如哈希)的速度但是到最后量子计算机发起攻击的方式依然是暴力破解和传统的计算机并没有什么不同

不论我们选择什么算法显然我们都在驶向一个计算更高效的未来我们必须尽全力挑选最好的工具并经得起时间的考验

本文作者是Raul Jordan文章来源于medium.com,由蓝狐笔记社群“李熙和”翻译

Total
0
Shares
Leave a Reply
Related Posts

了解加密货币挖掘的基础知识

了解加密货币挖掘的基础知识 加密货币挖掘是验证交易记录并将其添加到称为区块链的公共分类账的过程此过程对于数字货币网络的安全和维护至关重要加密货币矿工因他们的努力而获得奖励并为添加到区块链的每个区块收取少量费用什么是加密货币挖矿? 加密货币挖掘是验证交易记录并将其添加到公共分类账(称为区块链)的过程此过程对于数字货币网络的安全和维护至关重要加密货币矿工因他们的努力而获得奖励并为添加到区块链的每个区块收取少量费用加密货币挖矿如何运作? 加密货币挖掘涉及使用专门的计算机硬件来解决复杂的数学问题当矿工解决问题时他们会获得少量加密货币作为奖励这个过程被称为“工作量证明”是保护和维护加密货币网络的基础我需要什么才能开始挖掘加密货币? 在开始挖掘加密货币之前您需要做一些事情。 first,您需要一台配备强大显卡的电脑这将使您能够更有效地挖掘您还需要下载并安装加密货币挖矿程序例如 CGMiner。 at last,您需要加入矿池以增加获得奖励的机会加密货币挖矿的好处是什么? 加密货币挖掘可能是一项有利可图的工作矿工因他们的努力而获得加密货币奖励这些加密货币可以兑换成现实世界的货币。 also,矿工正在帮助保护和维护网络这对于任何数字货币的长期成功都是必不可少的结论 加密货币挖掘是有助于保护和维护数字货币网络的重要过程通过了解加密货币挖矿的基础知识您可以开始探索成为矿工的潜在回报和好处有了合适的硬件和软件任何人都可以开始挖矿并有可能获得奖励
Read more

探索不变性在软件开发中的好处

探索不变性在软件开发中的好处 在过去的几十年里软件开发取得了长足的进步随着技术的进步用于创建复杂软件应用程序的工具和技术也在进步软件开发中最重要的概念之一是不变性即程序的某些元素应保持不变。 in this article,我们将探讨不变性在软件开发中的好处以及它如何帮助提高代码质量什么是不变性? 不变性是计算机科学中的一个概念它指出程序的某些元素应该保持不变这意味着一旦设置了元素就无法更改此概念通常用于确保数据不会被无意损坏或更改不变性的好处 在软件开发中使用不变性有几个好处最明显的好处是它可以帮助防止数据损坏或意外更改通过确保某些元素保持不变您可以放心您的代码不会以任何方式被更改或损坏。 also,不变性有助于提高代码的性能由于程序的某些元素不会发生变化因此可以缓存和重用它们从而使您的代码运行得更快这在开发大型复杂的应用程序时尤其有用。 at last,不变性还有助于提高代码的可读性和可维护性通过确保某些元素保持不变可以更轻松地理解和调试您的代码。 over time,这有助于减少维护代码所需的时间和精力结论 不变性是软件开发中的一个强大概念可以帮助提高代码的质量和性能通过确保某些元素保持不变您可以防止数据损坏和无意更改提高性能以及提高可读性和可维护性如果您希望提高代码质量请考虑在软件开发过程中实现不变性
Read more

智能合约保护商业交易的新方式

智能合约保护商业交易的新方式 在商业世界中安全是重中之重企业需要保护他们的数据和交易免受潜在黑客和其他恶意行为者的侵害为此他们传统上依赖于人工流程例如纸质合同和人工验证文件。 However,随着区块链技术的出现企业现在可以使用一种更加安全和高效的方式来进行业务交易智能合约什么是智能合约? 智能合约是一种计算机协议用于促进验证和执行合约的谈判和履行它是一种存储在区块链上的数字协议区块链是一种分布式账本技术这允许合同的安全透明和不可变的记录智能合约是自动执行的这意味着一旦满足合约条款合约将自动执行条款和条件智能合约的优势 与传统合约相比智能合约具有许多优势它们更快更安全更高效它们还减少了对手动流程的需求例如文书工作和文件验证智能合约还可以降低欺诈风险因为它们是不可变的一旦写入就无法更改。 also,它们更具成本效益因为它们消除了对中介和律师的需求智能合约如何运作 智能合约是使用编程语言编写的例如 Solidity这种语言用于定义合同的条款和条件例如涉及的各方付款金额和执行条件合同一旦写好就会存储在区块链上由矿工验证和执行矿工检查代码以确保其有效然后在满足条件时执行合约结论 智能合约是确保商业交易安全的革命性方式它们比传统合同更快更安全更具成本效益它们还降低了欺诈风险并消除了对中介机构和律师的需求随着区块链技术的兴起越来越多的企业转向智能合约来确保交易安全
Read more