来源:刘教链
“哈希”这个词在英文中的本意是“把东西切碎”、“把事情弄的一团糟”的意思。用到计算机的语境里,也是借用了这个词的本意,指把数据切碎、弄乱掉,乱到你根本无法恢复出原来的数据。
1974年图灵奖(IT界的诺贝尔奖)获得者、《计算机程序设计艺术》(TAOCP)作者、美国计算机科学家、斯坦福大学退休教授高德纳(Donald Knuth, 1938-)在他出版于2000年的书《排序和搜索》中考证了“哈希”(hash)一词作为计算机术语的来历。“哈希”这个词在英文中的本意是“把东西切碎”、“把事情弄的一团糟”的意思。用到计算机的语境里,也是借用了这个词的本意,指把数据切碎、弄乱掉,乱到你根本无法恢复出原来的数据。就像把一本《红楼梦》撕成无数碎片,丢到火炉里一把火烧掉,从灰烬里捡回来几十个依稀可辨的字,把这几十个字拼凑起来,就是这本红楼梦的残片。就是上帝,恐怕也难以从这残片还原出原来那本《红楼梦》的全部内容。“哈希”则比这火炉有一个更优秀的特点,那就是对于同样的内容,每次焚毁后都会剩下同样的残片,仿佛时光倒流、事件重演一般。具有这种计算“哈希”功能的计算机函数就叫做“哈希函数”(hash function),计算的结果就叫做“哈希值”(hash value)。据高德纳考证,美国IBM公司的图书馆和信息科学家汉斯·彼得·鲁恩(Hans Peter Luhn)在1953年的笔记中首次使用了“哈希函数”这个概念。这个词迅速流传开来,得到了广泛的使用。虽然直到70年代末,它才正式出现在学术刊物上。
哈希,又叫做“摘要”,“散列”,或者“杂凑”。哈希不是一种信息压缩技术,虽然它也会大量丢弃数据,只产生一个固定长度的摘要。对照片或者音乐进行有损压缩,追求的是还原度和保真度;对数据做哈希计算,追求的结果恰恰相反。哈希也不是一种加密技术,虽然它的计算结果变得像密码一样无法理解。加密是为了解密,哈希则是为了无法解密。哈希也不是一种随机数计算技术,虽然它的计算结果看上去像随机数一样无规律可循。真随机数是非确定性的,每次计算结果都不同;哈希的结果虽然看似无章可循,但是只要输入的内容是相同的,结果必定相同。
哈希不是一种信息压缩技术,也不是一种加密技术或者一種随机数计算技术密码学哈希函数(CHF, Cryptographic Hash Function),则是一类具有独特性质的哈希函数。所有这些性质中,有三个性质是非常关键的:
第一个性质就是,计算结果的分布非常稀疏,几乎不会出现两份不同的输入内容算出来同样的哈希值,这个性质叫做“免碰撞性”(collision-free)。
第二个性质就是,计算结果毫无规律,你很难通过变换输入内容,然后对比内容及其哈希之间的规律,试图破译一个陌生哈希值的原始输入内容,这个性质叫做“隐藏性”(hiding)。
第三个性质就是,给出一个指定的哈希值,找到一个输入内容,能够计算出这个哈希值的最有效方法,就是穷举尝试,又称作暴力破解,这个性质叫做“谜题友好性”(puzzle-friendly)。而密码学哈希函数的这三个特性,对于中本聪成功设计出比特币,起到了决定性的关键作用。
2004年、2005年,中国密码学家、中科院院士王小云教授和她的团队先后攻破了迄今仍在广泛使用的两个高度流行的哈希算法,一个叫做MD5,另一个叫做SHA-1。MD5是Message Digest 5(信息摘要算法第5版)的缩写。而SHA-1则是Secure Hash Algorithm 1(安全哈希算法第1版)的缩写。王小云团队对这两个哈希算法的破解都是完整版破解,均属世界首次,一时之间,举世瞩目。
王曉雲院士为什么对这两次破解全球如此轰动?因为MD5和SHA-1这两个哈希算法的使用实在太广泛,广泛到即使在它们已经被完全攻破15年后的今天,仍然在被大量的软件、网站和系统使用着,上到政府网站,下到手机应用,这两个算法的身影无处不在。当我们注册网站或者登陆App输入密码时,常见的设计是,为了保护隐私数据,密码通常不应明文存储在数据库里,而应该存储其哈希值。但是,时至今日,大量网站系统仍然在使用MD5或SHA-1哈希算法。这无疑就是让我们的密码和隐私数据处于实质上的裸奔状态。大部分的用户,也许包括你,为了避免密码记忆之苦,又往往在不同的网站和App使用相同或者相近的密码。这样,当黑客攻破了安全最薄弱的一个网站,拿到了你的数据,破解了你的密码,就能用你的用户名和密码去登陆其他网站或App翻看你的更多隐私,甚至以你的名义对你的家人和朋友实施社会工程学攻击,骗取他们的信任,拿到更多的隐私信息,直至最终触及你以及你家人、朋友的财产和核心利益,并实施不法侵占或勒索。
MD5算法的“碰撞攻击”(找到两个输入其哈希值相同)最佳破解记录是由谢涛(音, Tao Xie)等人于2013年3月25日发表;“原像攻击”(找到原输入)最佳破解记录是由佐佐木悠(Yu Sasaki)等人于2009年6月16日发表。而SHA-1算法的“碰撞攻击”最佳破解纪录是由盖坦·勒伦(Gaëtan Leurent)等人于2020年1月8日发表。SHA-1算法的“原像攻击”方法迄今尚未找到。
MD5算法是由美国MIT大学教授、密码学家罗纳德·里维斯特(Ronald Rivest)在上世纪90年代前后所设计的一系列信息摘要算法的其中一个版本,其设计于1991年,并于1992年被IETF(国际互联网工程任务组)吸收为RFC(征集意见稿, Request For Comments)标准,编号1321,成为全世界互联网使用最多的加密算法之一。而作为美国政府1993年启动的“冠石项目”(capstone project)的一部分,SHA-1算法则是由NSA(美国国家安全局)主导设计的一系列安全哈希算法之一,是SHA-0的后继版本,在1995年由FIPS PUB 180-1号文件予以公布,同样的,在互联网领域,比如很多网站浏览器的加密证书中,有着极为广泛的应用。不知道如果没有王小云在中本聪开始着手设计比特币之前两三年发表论文,指出MD5和SHA-1算法已经不安全,中本聪会不会采用这两个算法中的某一个。以中本聪对密码学的敏感度,相信他应该不会。不过,历史从来不容假设。
韓非子战国末期法家思想的集大成者韩非子(约公元前280年-公元前233年)在《韩非子·难一》中记载了一个“矛与盾”的小故事。故事说,有一个卖矛和盾的楚国人,一会儿叫卖自己的矛,说自己的矛是世界上最锋利的矛,什么盾都能刺破;一会儿又叫卖自己的盾,说自己的盾是世界上最坚固的盾,什么矛都挡得住。这时围观的群众里有人说,那你用你自己的矛,刺一刺你自己的盾,那又会怎么样呢?这个楚国人一时语塞,竟然一句话也答不上来。
围绕哈希算法而展开的攻防较量就仿佛这矛与盾。今天道高一尺,却不知明天是否会有魔高一丈。攻守之道,往往都是攻方容易占据有利地位。正道的攻方,往往会收获比守方更大的荣誉;邪道的攻方,则直接从成功中获得巨大的利益。成功攻破MD5和SHA-1的王小云教授世界闻名,而这两个算法的设计者却鲜有人记得他们的名字。巨大的荣誉激励或物质激励推动着攻方不断的努力,攻守之势总归是一种不对称的、艰巨而长期的博弈。我们知道,也许今天所有已知的加密算法,在未来某一天都终将被破解,但我们不知道,这一天究竟何时到来。要让比特币系统能够安全运行100年、200年甚至更久(比特币挖矿结束时间大概到2140年左右,可见比特币的设计寿命至少也得一两百年往上),中本聪不得不在今天做好充分的考虑和设计。
中本聰2001年,NIST(美国国家标准局)公布了联邦标准FIPS PUB 180-2号草案。在该草案中,安全哈希算法SHA-2家族首次亮相,并于次年8月正式成为新的安全哈希标准。SHA-2家族包含了6个哈希函数,以其摘要长度(即计算出来的哈希值的长度)命名,比如SHA-256(摘要长度256比特)、SHA-512(摘要长度512比特)等。而其中的SHA-256算法,正是被中本聪选用,从而在比特币整个系统中几乎无处不在的哈希算法之一。
虽然SHA-256算法256比特的摘要长度只比SHA-1的160比特大了一倍,但是其安全性和破解难度却是天壤之别。对此,在2010年6月14日的一次论坛讨论中,中本聪专门就SHA-256的破解问题作出如下评价:
“SHA-256非常强壮。它不像从MD5到SHA1的渐进式进步。它可以几十年屹立不倒,除非出现某种大规模突破性的攻击技术。
如果SHA-256被全面攻破,我想我们可以达成某种共识,锁定出问题之前的「诚实的」区块链,并从那个位置开始采用新的哈希函数。
如果哈希攻破是逐渐发生的,我们有一个按部就班的方式过渡到新的哈希函数。(比特币)软件可以编写成从某个特定的区块号码开始采用新的哈希函数。每个人都需要在那个时间点升级。(比特币)软件可以把所有旧区块的新哈希值保存一下,如此可以确保对于旧区块的篡改——即便旧哈希值相同——也不会被接纳。”
20世纪80年代,欧盟启动了“RACE(欧洲先进通信技术研发)计划”,并于1992年启动了“RIPE项目”。其中项目名“RIPE”的具体含义是“RACE完整性原语求值”(RACE Integrity Primitives Evaluation)。从这个名字我们就能读出“哈希”的味道,因为对给定内容求哈希值这一计算机指令(术语叫“原语”)正好可以用来验证内容的完整性,也就是没有被篡改。如果发生了篡改,即使再微小,也会导致哈希值的剧烈变化,从而很容易被发现。在“RIPE项目”的执行过程中,一个哈希算法被设计出来了,它的名字叫做RIPEMD(RIPE消息摘要, RIPE Message Digest)。
RIPEMD家族也有一系列所求摘要长度不等的哈希函数。其中摘要长度小于160比特的,被认为安全性不够,而摘要长度大于160比特的,其实际安全强度也就只有160比特,超出的部分只是为了凑够长度。所以,就余下一个RIPEMD-160不长不短刚刚好。根据我们对哈希算法命名的了解,RIPEMD-160计算出来的哈希值长度为160比特币,这个长度和SHA-1是一样的,都比SHA-256要短。中本聪说,“为了让比特币地址更短,它们是公钥的哈希,而不是(椭圆曲线电子签名算法的)公钥”。事实上,中本聪不是用了一个哈希函数,而是两个。他先对公钥做了SHA-256哈希,然后把结果又做了一次RIPEMD-160哈希,得到了比特币地址。这种双层哈希的设计,是中本聪的一个独特手法。在比特币区块挖矿中,也是这样的双层哈希结构,只不过换成了两层SHA-256。
这种双层哈希的设计,是中本聪的一个独特手法。中本聪没有解释过如此设计的原因。今天的我们已经知道,MD5、SHA-1、SHA-2这一系列的哈希算法,当然也就包括中本聪选用的SHA-256哈希算法,由于都使用了一种称之为“默克尔-丹加德”构造(Merkle–Damgård construction)的方法,而对一种称之为“长度扩展攻击”(length extension attack)的攻击方法敏感。通过使用这种攻击方法,攻击者可以在无需知道原文、只需知道原文长度的情况下,向原文后附加攻击文本并计算出正确的哈希值。今天我们能够查到的最早有关该攻击方法的文献,只能追溯到2012年。至于中本聪在2008年前后设计比特币时,是如何觉察到单层哈希可能会对某种特别的攻击方法敏感,从而在使用时小心翼翼的加了一层,形成双层哈希设计,我们就不得而知了。也许,他是受到了NIST(美国国家标准技术局)在2006年举办的哈希函数设计大赛的启发吗?
2006年,NIST举办了一场后来旷日持久的哈希函数设计大赛,赛题是设计一种不使用“默克尔-丹加德”构造的崭新的哈希函数,称之为SHA-3。彼时,SHA-3的设计目标并非为了取代SHA-2,因为后者并未被攻破。但是因为MD5和SHA-1在2005年被王小云教授团队成功攻破了,NIST感觉需要未雨绸缪,于是希望提早着手,为SHA-2准备“备胎”。这个大赛,可以称之为SHA-2的“备胎计划”。
这个“备胎计划”的推进一波三折。2010年12月,一个称之为keccak-256的哈希函数最终胜出。NIST希望在标准化时对其设计进行微调和修订,却被2013年突发的“棱镜门”事件和斯诺登的“吹哨”打乱了节奏。公众失去了对NIST的信任,对NIST修订哈希函数的提案进行了强烈抵制。就这样一直僵持到2015年,NIST才最终完成了修订并发布了FIPS 202标准。另外一个由俄裔加拿大程序员维塔利克·布特林(Vitalik Buterin,人称“V神”,时年仅19岁)于2013年发起的知名公链项目,以太坊(Ethereum),大量使用了keccak-256哈希函数,但是,他们使用的是重写的原始版keccak算法,而不是NIST的修订版算法。由于keccak算法没有使用“默克尔-丹加德”构造,而是使用了另外一种称之为“海绵构造”(sponge construction)的新方法,所以对“长度扩展攻击”免疫。也因为此,以太坊的地址就是单层哈希结构,只对公钥做了一次keccak-256哈希(并截取了后20位以缩短长度)。
网友评论