【技术分析】区块链的密码学之二 (1)



     前言:谈区块链离不开密码学。从凯撒密码到维吉尼亚密码,从单表位移到多表代换,从对称加密,到非对称加密,密码学已经走过了漫长的三千年。作为一门古老的学科,如今却又因为互联网和区块链技术重新闪耀光彩。传统互联网离不开密码学来保护一切可能被攻击的信息传输,区块链则利用块链式数据结构来验证与存储数据、利用分布式节点公式算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。区块链的核心是它按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。我们对此做一个总结,可以发现区块链中有四项不可缺的核心技术,分别是分布式存储、共识机制、密码学原理和智能合约。今天我们将延续上周的话题,继续从密码学的角度聊一聊区块链的起源问题。

 

【失灵的SHA-1】

​      区块链玩家应该都对一个词非常的熟悉——哈希。


      Hash,一般学术界翻译做“散列”,程序员直接音译为“哈希”,它的操作是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。


      所有散列函数都有一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,这种情况称为“散列碰撞(collision)”,这通常是两个不同长度的输入值,刻意计算出相同的输出值。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。


      哈希函数需要满足下述条件:


      a.确定性:哈希函数的算法是确定性算法,算法执行过程不引入任何随机量。这意味着相同消息的哈希结果一定相同。

      b.高效性:给定任意一个消息m,可以快速计算HASH(m) 。

      c.目标抗碰撞性:给定任意一个消息m0 ,很难找到另一个消息m1,使得HASH(m0)= HASH(m1) 

      d.广义抗碰撞性:很难找到两个消息m0不等于m1 ,使得HASH(m0)= HASH(m1)。


      在密码学上,一般认为如果d条件不满足,那么此哈希函数就不再安全。在实际中,一般认为如果在某种程度上c条件不满足,那么此哈希函数就不再安全。当然了,如果c个条件完全不满足,那么此哈希函数已经彻底不安全,应该被直接弃用。


      哈希一般的实际应用被称为安全散列算法,(英语:Secure Hash Algorithm,缩写为SHA),它是FIPS认证的安全散列算法,是一个密码散列函数家族。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高(以前被认为无限趋近于99.99999999%,为啥是以前,稍后解释)。


      密码学作为一门古老的学科,有着悠久而奇妙的历史。它用于保护军事和外交通信可追溯到几千年前文字刚刚产生的上古时期。几千年来,密码学一直在不断地向前发展。从凯撒密码开始,人们在发展新密码学算法的时候也在孜孜不倦的破解已有的密码学算法,因为对于破解者来说,密码难度越高,意味着其背后守护的秘密价值就越大。SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,后几个一般也可以统称为SHA-2,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。也是众多互联网和电子产品的密钥门神。


      SHA系列Hash函数家族是最为知名的Hash函数家族,MD5,SHA-1和SHA-2都一直被广泛的使用,比特币使用的就是属于SHA-2系列里的SHA-256凑杂算法。1990年MD4算法被提出,但是被很快发现了严重的安全问题,在1992年被MD5算法取代。MD5算法在之后的十几年内被软件行业广泛使用,直到2004年我国密码学家王小云在国际密码讨论年会(CRYPTO)上展示了MD5算法的碰撞并给出了第一个实例。该攻击复杂度很低,在普通计算机上只需要几秒钟的时间。在2005年王小云教授与其同事又提出了对SHA-1算法的碰撞算法(Finding Collisions in the Full SHA-1, CRYPTO 2005),不过计算复杂度为2的69次方,在实际情况下难以实现。


      直到去年(2017年)的2月24日,谷歌抛出了他们惊人的实验结果——公布第了一例SHA-1哈希碰撞实例,这项发表甚至使密码学界最为著名的顶会CRYPTO为等其论文修改结果延期了19个小时。因为简单来说,Google的工作基本宣判了SHA-1的死刑。在这项工作公布前,大多数网站https的证书都涉及使用SHA-1算法,包括GitHub在内的众多版本控制工具以及各种云同步服务都是用SHA-1来区别文件,很多安全证书或是签名也使用SHA-1来保证唯一性。长期以来,人们都认为SHA1是十分安全的,至少大家还没有找到一次碰撞案例, 不过如今不得不为用户安全考虑开始升级至SHA-2或者其他算法了。


      CWI和Google的研究人员们成功找到了一例SHA1碰撞,而且很厉害的是,发生碰撞的是两个真实的、可阅读的PDF文件。这两个PDF文件内容不相同,但SHA1值完全一样。

 


      为什么这一研究结果的发表如此引人注目?这是因为大家都知道散列算法可能存在碰撞, 但只要这种碰撞难以创造,散列算法所支撑的系统就是安全的——而大家之前一直认为SHA1的碰撞案例很难实现。Google证明这一说法是站不住的,尤其是在现在GPU并行计算得到大范围应用的情况下。Google使用110块GPU,经过一年的计算,总共进行了9百亿亿次计算(总共9,223,372,036,854,775,808次)创造了这一碰撞案例——这一计算过程的时间开销固然庞大,但就现在非常普遍的大规模计算中心来说,并不是难以实现的。这意味着目前实现对于SHA1的碰撞攻击仍然需要海量的计算时间

 

 

      MD5和SHA-1虽然已经不建议被使用,但并不能说它们就已经完全过时。事实上,现有的各种更优秀的密码算法都是在旧算法的基础上建立起来的,而旧的算法体系往往也并不是因为存在固有漏洞而被人们抛弃——计算能力的飞速发展导致我们的基础算法必须不断改进,才能适应生产环境的需要同时避免潜在的安全风险。我们也必须保持以最新的眼光来看待和处理工作,当新的技术突破出现时及时关注,切勿墨守成规,固步自封。SHA-1和SHA-2是SHA算法不同的两个版本,它们的构造和签名的长度都有所不一样,但可以把SHA-2理解为SHA-1的继承者。比特币采用的SHA-256属于SHA-2的256位用法,当年(2008年)中本聪构写比特币时,未曾考虑到SHA算法这么快就能被破解,不过所幸后来的各类数字货币采用了更多更难破解的加密算法,具体大家可以往回翻翻我之前写的《加密货币如何加密》系列。不过从SHA-1被Google攻破来看,所有承载巨大市值的加密货币都应该引起警觉,因为共利共识的维护,还是必须建立在加密算法的基石之上。



END


今天关于区块链&密码学二的文章就这里

如果有任何技术上的问题想与我讨论

欢迎加入EKT公链开发QQ群:699726921

项目交流QQ群:173806202

欢迎关注微信公众号:EKT通用积分


猜你喜欢

转载自blog.csdn.net/weixin_42120252/article/details/80987549