王小云:Hash函数和区块链技术

摘要:Hash函数是一类基础密码算法,主要用于检测消息完整性,与签名算法一起保证电子签名的合法性与抗抵赖性,是设计众多密码系统的关键部件,如消息认证码、区块链和可证明安全密码系统等。本文介绍了Hash函数的基本安全属性及其在密码系统设计中的重要应用,特别是区块链技术与产业中的重要应用。

王小云

王小云    中国科学院院士,国际知名密码学专家

关于区块链技术,我有不同的感受。我是1995年开始做Hash函数的研究,因为当时Hash函数有三个安全属性,这三个安全属性被用来设计各种各样的密码体制,各种各样的密码系统离不开Hash函数。因为很多密码系统在攻击的时候,有一种攻击就是直接把密钥求出来完全破解,有的是通过修改函数得到密钥或敏感信息被破解,而防止修改函数是通过Hash函数来保障的。我当时做Hash函数的分析,就一点,就是认为,很多密码系统的安全性还是Hash函数,我要分析Hash的安全性。我也非常幸运,把国际上当时的两大算法给出了非常好的碰撞解攻击,这是我做的一个工作。

区块链技术和现在做的很多事情,我也感觉到非常激动。以前Hash函数用来绑定各种各样的敏感信息,比如这个密码系统是安全的,今天我们用Hash函数绑定各种各样的交易系统,就变成到我们今天的区块链。只是绑定信息的内容不一样,所以导致它的功能不一样。所以说,区块链技术是Hash函数的定义,但是密码Hash函数,不是指的网络互联网系统里的Hash函数,是密码Hash函数定义产生的那一天起,实际上就已经有了区块链技术,只是我们不清楚,当时只是局限在绑定密码系统的Hash参数上,而不是绑定交易信息本身。但是确实Hash函数绑定交易信息的时候,有各种各样的应用,应用在各种场景里,非常灵活多变。下面首先看一下Hash函数的定义和应用。

 一、Hash函数简介及应用。

密码学的重要性性,是网络空间安全的理论支撑,所有的科学问题仍然是数学问题。网络信息安全的四大属性,加密算法保证的是机密性,数字签名算法保证的是可认证性和不可抵赖性,好多老师都是用这两个属性。Hash函数保证的是完整性,但是Hash函数一定要绑定数字签名的敏感信息,保证完成可认证性和不可替代性的问题。所以,没有Hash函数数字签名,本身是汉南完成可认证性和不可否认性的。大家可以看出来,Hash函数和三个安全属性有关系,唯独跟机密性关联性不大,但是也有人设计了一种加密算法,也使用了Hash函数,是这么一个关联性。

为什么要用Hash函数呢?1981年为了避免RSE的攻击,提出了密码Hash函数。实事求是讲,非常简单,因为所有的电子签名算法有一个代数结构,Hash就是为了破坏它的代数结构。通过绑定信息,破坏代数结构来完成。Hash实际上就是一个压缩函数,它把任意一个消息压缩为固定长度的数字指纹,每个人的指纹都是世界独一无二的。如果你把这个消息提炼一个数字指纹以后也是独一无二的,只不过这个数字指纹有128BT、160BT、192BT,或者是256BT,最长的可以到512BT,这个消息串就是这个消息的指纹。你拿到这个指纹去签名,干其他事情就可以了。

Hash函数有个属性,大家一定要知道,你要学区块链只要记三个属性,其他的不用记了。一个是碰撞性,如果两个合同,比如100万和2000万的压缩结果数字指纹是相同的,它的签名一定是相同的。所以说,Hash函数一定要抗碰撞攻击。我们也有电子签名法,我们有网络安全法,也有电子签名数字驱动这一块,实际上就是基于这个无碰撞性,两个消息不能发生碰撞。有碰撞的话,你就不能证明哪个是合法的,哪个是非法的。还有一个就是抗原像攻击,我知道这个消息的指纹以后,我不能恢复它的源消息M,不能得到消息M的任何一BT的信息,任何信息都不能得到。大家想像一下,如果有保护口令,M是我的口令,用了Hash函数,那么口令就很难得到,是得不到的。因为我的电脑里存放的是它的Hash值,而不是口令本身,这是保护口令的一个属性,当然,也可以保护其他的,可以绑定我们的交易信息。M藏起来,你只能看到Hash值,得不到M的任何信息。所以根据你的实际应用灵活使用,我讲的意思就是你可以在任何交易里面灵活使用,不是一个死的东西。

第二原像攻击,就是说,有一个消息M1,你不能得到另外一消息M2和M1的数字指纹是一样的,也就是一个消息有指纹,有签名,不能达到另外一个消息跟它的签名是一样的。大家也可以看出,签名的工具可以通过碰撞得到攻击,也可以通过求解第二原像得到攻击,不是单一的。也可以求解原像得到他的攻击,都没问题,可以围绕一个新的消息,都是可以的。所以大家要注意一下,它的功能就是说,一种攻击可以通过多种属性破解来达到攻击的效果,只是攻击的难度不一样而已。攻击难度我就不讲了,因为今天不是一个纯学术的。

Hash函数可以用在很多种密码系统,我们的电子签名、数字证书、比特币、区块链,各种各样的可证明安全系统。大家可以看一下SSR、VTA、RPJACK里面,都有了Hash函数来保障它的安全性。当然它的安全性有很多地方,有很多保障点,Hash函数肯定是很关键的地方,来保障它的安全性。有一点毋庸置疑,就是一个Hash函数的破解可以导致众多基于Hash函数的密码系统被破解。大家可以有一个很典型的实例就是火焰病毒,火焰病毒我们做了MD5的破解以后,火焰病毒就是用MD5破解的。实际上我听了很多业界的人在讲火焰病毒,但是大家可以参考一下密码里面把火焰病毒的攻击路线拿出来了,大家一看这个主体路线,肯定是我们给出来的MD5的主体路线。那个框架就是我2005年的一次谈话,后来我花了一阵子时间给他一个攻击的框架,两个一结合,实际上就是一个火焰病毒。通过密码计算机技术,把它嵌入到微软操作系统的升级里面,就是我们的火焰病毒。所以说大家一定要注意一下,一个算法不安全,你不知道它会在哪里发生攻击。

这就是当时国际上主要的Hash函数算法,MD是第一次破解,MD5、沙盘都是我们第一次破解的,给出的是碰撞攻击。欧洲的MD160还是安全的,沙盘没能被破解,沙盘破解以后,又花了5年的时间新设计了算法。还有一个算法就是SM没写进来,SM是国产的算法,是当时我们破解了MD5沙盘以后一个团队设计的新的算法。大家可以看出来,安全算法不是太多,但是大家要注意一点,沙图做了比特币,比特币就是用沙图来做的。

实际上我们看看Hash函数的应用,第一个就是电子签名,我对一个文件进行签名,首先对它进行压缩,得到数字指纹,然后对数字指纹调用RSA或者是SM2,或者是ECC,我们就可以得到它的签名,就是这样一个架构。我们也可以看一看Hash函数的登录系统,管理员可以从数据库里面得到用户密码,有口令,所以口令并不是密码。但是如果你的口令是用Hash函数来放的,并且如果是动态的就更安全,可以是放的动态的,这个时候,它的安全性就非常高,大家可以参考一下。实际上我要做一个登录系统,用Hash函数加上动态的一些技术,就可以保证你登录的安全性,实际上也比较简单,非常成熟,就是大家可能在用的时候不知道它是怎么样来保证安全性。虽然你用的是Hash函数,我也是用的Hash函数,但是你用的Hash函数不安全,我用的Hash函数可能就是安全的。所以大家要了解一下,这个密码技术的本质是什么就可以了。

Hash函数可以延伸密钥。为什么?大家知道,我们在加密的时候都是用的对称密码算法。对称密码算法的密钥一个月、半年、两年换一次,密钥怎么换?有一个主密钥,每一次换的是用Hash函数来衍生就行了,是最好的一个办法。并且每次衍生的时候,两个人选一个随机数,它就是绝对随机的动态密钥的一个生成的办法。你的U盾里面每次可以存放这个衍生以后的算法,主密钥可以不要了,流掉就可以了,所以说是非常好的技术。我不知道他们是怎么做的,这种技术可以放在银行的U盾里面,可以作为公司的一个产品来赚钱就可以了。

二、比特币。

跟比特币区块链有很好的联系,比特承诺,就是说Alice有一个秘密,我要卖钱,我要有一个秘密,要进行承诺,Alice过后要验证,比如我知道一个预测股票升或者降的很好的软件,我要放在这个Hash里面,要公开它的Hash值,M不公开。Alice要验证,我先承诺,把Hash值定高。比如说一个月以后,包括我预测的股票该升的升,该降的降,成功率很高,他就要买我的这个软件。承诺这个M,我要对M进行一次压缩,就是对它进行一次承诺。隐藏了M的所有信息,Bob得不到M的任何信息。如果他要得到了以后,他就不用买你的了,他就可以预测了,所以说,Bob不能得到M的任何信息,Alice不能替换和篡改M的任何信息,大家可以看一下,Bob得不到M的信息是原像攻击,Alice不能替换和篡改M的任何信息是第二原像攻击和碰撞攻击,可以事先做,后面就是碰撞攻击。大家可以看出来,基本上这三个属性,把大家所有攻击的企图就达到了。三个属性就够了,任何人不能在Hash函数上做文章,想得到攻击是不可能的,三个属性已经足够了。你可以想各种攻击,基本上不可能成功,这就是密码的用途,能把所有的攻击挡在外面。

这个就是我们通常叫做,M我们就是隐藏性,就隐藏信息了。绑定性就是说Alice一旦做出了承诺以后,这个信息不能再进行修改,过后你打开的一定是源信息,不能是修改以后的信息。如果你打开的是修改以后的信息,那就意味着你已经成功的进行了碰撞攻击或者是第二原像攻击,那是不可能的,因为它是世界性的数学难题。除了MD5沙盘对我们破解的算法以外的,其他的仍然是安全的。

这是证明,大家可以看出Hash函数的妙用。为什么我们设计密码系统是安全的?大家知道,身份证明我就不再讲了,你要证明没有一个秘密,Alice要向Bob证明一个秘密,又不能让Bob知道这个秘密本身是什么东西,但是Bob又要相信你知道这个秘密,你就要用知识知名。Bob搜一个挑战,0或者是1,我就给出一个回应,证明一个式子,这个我就不再讲了。一般来讲,要交互128次,效率特别慢。但是我用了Hash函数就不一样了,Hash函数一次性就可以完成。不用交互,一次性完成就行了,这就是Hash函数的一个妙用。

这个图显示了,你利用Hash函数证明我知道一个秘密,就是Alice只要把一些参数,R和Y公布以后,Alice知道都有一个JX秘密,知道一个秘密。最后Bob连挑战R都不给了,Alice最后自己直接计算,一个Y和R的验证,任何人都可以验证,β=A的Y次方,V的R次方。Alice藏在V里面的秘密,只要计算两个值,所有的人一验证就知道我知道了这个秘密,非常简单,一次性解决这个问题。所以Hash函数多么好用?让我们的互联网变得极其简单而又可信,这就是它的应用。

为什么看一些论文里面,大量的都是可证明安全的论文,基本上都是Hash函数,用起来特别方便简便,只是根据实际需要来设计不同的系统,根据不同的攻击的场景,设计不同的系统,是做这样的工作。但是比特币我们就开始走向另外一方面,跟交易有关系了。比特币不管这个人是虚幻的也好,还是实际的也好,大家认为中本聪是比特币的提出者。他就是去中心化,为什么去中心化?我大体说一下使用的灵活的绑定交易技术,灵活的技术来绑定交易,没有使用隐藏技术。因为去中心化全球都知道交易没有使用隐藏技术,挖矿使用弱化的原像解,任何人都挖,挖出一个解来就是一个比特币,这是一个弱化的原像解,因为原像解是非常难的,全世界的计算机25亿年的计算量才能达到2的110次的计算难度。我们的比特币的原像解是2的250次的计算难度,就是多少亿个45亿年都做不出来全球的运算资源,所以原像解不可能找到。我一定要把原像解降得很弱,弱到一定程度就找到这个原像解,这个原像解就是比特币这么一个东西。

Hash函数是一个Y,是一个数字指纹,我只有求Y的前70个比特是0,一开始60个比特是0,我要找一个Y,就是说我要找一个M,这个M输出的Y,只要前70个比特是0,65个比特是0就可以了,这样就是一个比特币,不要求它的512倍是固定的,只要求70倍是固定,所以难度就变成了2的70次计算。如果他的256比特是固定的,计算难度是256次计算。如果是固定128BT,那么就是2的128次计算,就是全球的计算机资源,计算45亿年都找不到这个原像解,但是70个0就可以找到了。大家都知道,好多人玩过都知道难度,我就不说了,大家比我要有实际经验。

现在有好多的题目在里面,大家看比特币的结构。我们Block Hash,相当于我要一个结果,我输出的是多少个0,后面我们就不再研究了。大家看,Block Hash是上一次输出的,上一次比特币的输出结果是怎样的,你要放在里面。Nouns是你要在一个空间里面搜M这个解,让这个M满足输出结果是多少个0。所以说这个Nouns是一个随机数,是你自己选的随机数,你要做的空间。当然你要放进去,另外后面那些就是包含的TX1、TX2,就是全球的交易。目前全球的交易你要放在里面,当然不一定所有的交易,多少年以前的不行,现在一段时间内的交易放在里面。为什么?因为到时候全球的交易你通过这个Tree的结构会查找你的交易,比如说我在这个交易里面花了8块钱,我用5个比特币还是2个比特币?通过这个交易里面,将来会查到我还剩2个比特币,我的2个比特币在上一次交易的时候是可以用的,不是用过的,你得有查找的证据,还有产生的交易信息,都要查得到。这个我就不再说了,有一个网站,大家可以上去看,有完整的信息。

大家可以看出来,我们这个比特币就是绑定了比特币交易的信息,不是完整信息,是今天我买了3个比特币,卖了2个比特币,我以前还有3个币,我交易完2个,还剩下3个。通过TIX的信息,通过这个Tree的形式就能查国家,全球就通过这个Tree来约束你的交易过程。挖矿很简单,就是一定要挖出一个M,满足几十个0就可以了。最关键的是他这个结构,把交易放在里面了,大家可以查。

我认为这个交易信息还是比特币的一些信息,就是我挖出来的比特币,还是我买来的比特币,还是我卖了一部分比特币,还剩下一部分比特币,主要还是比特币的信息。大家看一看,如果我把整个的架构保持下来,TX变成交易信息,就变成区块链了。当然大家说区块链是去中心的,比特币是没有中心的,为什么比特币国家不支持?首先它会扰乱国家的金融市场,又没有中心。区块链为什么就火了又允许了?因为区块链是绑定了交易。另外,我可以通过签名,把可控物加进来,只要有数字签名就是可控的,国家的权威部门就可以介入,只是你允许不允许的问题,是有这个技术的。所以说区块链可以改造成有中心和无中心的交易管理技术。这个题目我不再讲了,因为时间有限。

签名的时候就是公钥和私钥,大家一定要注意,比特币并不是安全的,所有人的交易通过一个公钥就可以帮你找到,连接在一起,你早晚有一天是暴露的。张三交易了多少比特币是可以找到你的,因为你所有都使用的同一个公钥。所以如果你经常换公钥,你就得做得比较隐蔽一点,就是这样的一个技术。

这个攻击大家也值得关注。如果有一个人,有全球51%的计算能力,那就意味着什么?你能控制区块链的技术。为什么?因为你只要有超过一半的计算能力,因为挖矿是通过计算能力挖出来的。所以说,你如果超过全球的51%的计算能力,那么你就随意。实际上这个区块链的价值是你主导的,这个加链是你主导的,所以你有足够的能力主导这个链,可以做一些你想干的事情,这是一种计算能力的攻击。因为它是一个弱化的,不弱化的话任何人都做不了。如果弱化了以后,完全可以用你的计算资源。另外区块链技术是一个全球化的资源控制技术,任何一个国家你多少比特币,就意味着你有多少计算能力,所以这个计算能力在全球是透明的。我估计美国在了解全球的计算能力方面,通过比特币就可以做到,这是一个艰深的问题。

三、区块链的发展。

大家要知道一点,你把交易信息放在里面就变成了区块链技术,这是其一。其二你可以通过挖矿建链,你也可以不通过挖矿,只是使用一下绑定技术本身,没有挖矿之说,只是绑了一下这个交易信息,也是区块链。但是,你用分布式那种拜占庭协议,还有其他的技术来进行投票决策就可以了,要决策谁做账本的问题,因为这个链的建立就是做账本,进行投票就可以了。投票技术也是灵活多样的,可以利用拜占庭协议,可以利用密码技术其他的投票协议也是可以的,这个都可以,大家一定不要局限于现有的技术,这是非常灵活的开发平台。

四、小结。

首先我们的比特币虽然都不是匿名的,因为公钥说明一切,你所有的交易只有一个公钥,要经常换公钥,保证你的匿名性。第二个就是全球能力资源的监控问题,区块链还有一些共享算法的研究,分布式系统。当然我们把一些更深的密码技术放在区块链上,来研究新的一些区块链技术。另外我们还是希望国产密码算法的区块链产业,就是我们的SM3和SM2技术要推广使用。最后,我觉得还是要进行区块链人才的培养。

上一篇:倪光南:网络安全的核心是技术安全

下一篇:马斌:筑牢安全防线 安全人才培养体系化的企业实践