今年初我偶然跟一个朋友讨论到比特币这个话题,这个朋友没有接触过密码学也没有任何技术背景,所以认为比特币的制造跟随便印钱一样可以超发,仿佛会无中生有,其实大部分人平常所接触的虚拟货币类似Q币之类的,由某个运营商或平台发型作为交换服务的凭证,而该虚拟货币的发行完全就被该公司控制,现实世界中由政府发行的货币实际上跟这些传统虚拟货币一样,超发与否、价值涨跌完全由该平台运行者或政府完全控制。现在我们通过各种解读知道了比特币并不会无缘无故地超发,那么到底是什么保证了它与“普通”虚拟货币不同的特性呢?
答案就是——数学。
散列首先从散列讲起,散列又叫“杂凑”,国内也有根据其英文(Hashing)译为哈希,其实从名字的“零散地列出来”、“杂乱地凑起来”来看就知道,这是一种信息摘要算法,而摘要的意思和小学语文的把一段文章的中心大意提取出来类似。在计算机中,散列通常是经过某些特定的手段(例如经过一系列复杂的位运算)提取出某段数据的特征、该特征用来校验(比如验证从网络上下载的一个很大的文件的正确性)。语文课上的概括中心大意是根据概括的内容,你能还原出这段讲的内容是什么,而密码学级别的散列则恰恰相反,它使得你提取出来的表示数据特征的代码绝不能还原(或轻易还原)为原来的数据。
举例,现在流行的一种散列函数叫SHA-1,当你提交一个字符串: “The quick brown fox jumps over the lazy dog”
作为SHA-1的参数时,得到如下摘要信息: 2fd4e1c6 7a2d28fc ed849ee1 bb76e739 1b93eb12
但是哪怕你修改了一个字符: “The quick brown fox jumps over the lazy cog”
得到的结果也会发生翻天覆地的变化: de9f2c7f d25e1b3a fad3e85a 0bd17d9b 100db4b3
散列函数的这些特性保证了它不会轻易地通过小的修改和获得摘要的差别分析出算法的漏洞,以保证原始数据的安全。
那么散列函数该怎么用呢?它通常以“证明”的工具用。比如说Alice有一个字符串: “The quick brown fox jumps over the lazy dog”
Bob说我也有那么一个字符串和 Alice 一样,但是Bob并不信任 Alice,万一Alice是伪装那就会把自己真实的字符串泄漏给假 Alice;同时Alice也不信任Bob,因为如果Bob是冒牌的自己一样会把真实的字符串泄漏给假Bob;更可怕的是旁边站着一个间谍Eve时刻监听着Alice和Bob进行字符串交换的过程并且获得该字符串。那么如何让Alice和Bob两人互相相信对方不是冒牌货呢?简单的方法是两人将自己的字符串进行散列运算,然后比对即可。这样就算有人监听或者对方是冒牌货也不会泄漏原始数据。
这些类似SHA-1的散列函数是怎么来的呢?是经过美国国家安全局 (NSA) 设计美国国家标准技术研究院 (NIST) 发布的。而一个著名的散列标准(包括其他的加密标准)公开招标的过程是完全公开的,所有提交的算法和标准都会经过来自全世界无数顶级的密码学家的检验,所以可以基本认为“同时期”流行的散列算法(包括其他加密算法)是安全的。
从以上讨论可以看出散列的过程是不可逆的,所以具备证明原始数据同时保护原始数据的能力。最近很多网站爆出明文密码让众人哗然,因为对密码进行不可逆的散列运算是保证用户信息安全的最最基本的措施之一,而这些网站竟然都没有做该措施(想象一下明文密码泄漏后被人利用会用来尝试登录受害者的邮箱等其他帐号)。
工作证明那么比特币从哪来呢?就从这些散列函数的运算结果来。想象一下我们计算这么一道题,到底输入什么样的字符串,会得到一个散列结果开头是0?有人说我把该函数反向推导得到一个反函数不就可以获得原始结果吗?那可不行,因为这些散列函数是非常严密的经过无数数学家检验的,具有“密码学”级别安全度的,绝非轻易推导就能推导出来的,获得一个未知的原始结果的方法只能是穷举,换一句话说就是猜,把所有可能的结果一个个代入散列函数进行尝试,如果你恰好获得了开头为0的结果,恭喜你,你解出了该“数学题”,奖励比特币若干,该解题的过程就叫做挖矿(Mining)。刚开始这样的工作是非常简单的,一道题只需要普通个人电脑的 CPU 就能快速解出最初的几道题,随着挖矿的人数增加题目会越变越难同时获得的收益会越来越低,因为同样的时间内只会产生一定数量的比特币,而分配的过程只会根据按而解出题目的个数。为了获得更多的比特币,有的人把解题的过程编制为显卡的GPU程序,因为显卡的特点大家都知道,就是有很多流处理器可以短时间内做大量运算。买了高性能的显卡的人越来越多,用显卡挖矿的收益越来越少,于是一些人则干脆自己设计硬件,用专用的集成电路(ASIC)进行该解题过程,这类拥有大量专用挖矿集成电路的机器就叫做“矿机”。
分布式那么有人说,假如自己反复给自己出一些自己早就找到答案的“数学题”然后自己快速解答,岂不是能随意获得比特币?当然不行。比特币设计精妙的地方、同时也是区别于其他传统货币的地方就在这里。“数学题”的产生并非自己说了算,而是所有人一同采矿并且每个人都存储着一份采矿获得的结果—比特币的交易记录,自己制造的假的结果不算数,还得必须得到全网的其他人的认可。这么设计的结果就是,一个人不能随意伪造自己的财富,而自己已有的财富则会得到全网所有人的证明而不会被轻易剥夺。
证明力?这些密码学支撑的虚拟货币到底安全吗?“
从技术的角度来说,通常来说(下文会详细解释)”是安全的,实际上我们日常上网、银行、军事等活动中都是靠密码学来支撑,现在已经无法想象没有这一系列密码学保障,我们平常的生活会变得怎么样,而密码学归根结底就是数学。 这里我们看到,实际上数学已经完全作为一种自然元素而非人造的产品支撑着各种基于密码学的货币,它的证明力甚至强于黄金(也许人类的能力有一天可以强大到模拟黄金产生的过程,比如类似大爆炸的物理活动,但是所有的物理活动也无法违反数学的规律)。
而单单有数学的保证还不行,还得从社会的角度得到证明,也就是足够多的人相信比特币能改变他们的生活,能提供一种便携的支付手段,甚至仅仅相信它能作为炒作的工具而使用,这些经过大量散列运算得到的数据块就是有价值的。
安全性对于安全性方面我们还需要进一步讨论。首先说明,安全并不是一个数学公式、或一个算法的采用,更不可能是一个所谓的“安全产品”能保证的,安全是一系列正确实施的过程的组合。
举例,某公司为了保证自己产品的设计图纸或者源代码的安全,给公司每台机器安装了杀毒软件,公司部署了最好的防火墙,进门出门需要验证指纹,同时每个人不能携带存储设备出入也不能连接Internet。最后该公司的设计图纸和源代码还是被对手公司的间谍获取了,获取的方法很简单,该间谍贿赂了公司主管,让该主管复制了一份设计图纸和源代码带出公司交给间谍……
比特币也是一样,你说不能简单用安全或者不安全来概括,而应该考虑与比特币相关的所有环节,同时每个环节的安全措施都要做到位才能减少损失。
下面我根据发生的概率从高到低把一些可能威胁到比特币安全的事件列出来:
交易平台毫无疑问交易平台是最脆弱的环节之一,你将各种虚拟货币保存在交易平台(或者说托管在交易平台)那么你对该货币安全性的唯一措施几乎就剩下登录和交易密码的保护了。交易平台被攻击或被入侵的时间层出不穷,而损失也是惨重的,举几个例子:
10月23日,web比特币钱包Inputs.io被入侵,价值120万美元比特币被盗窃; 10月26日,比特币交易平台GBL携客户存款跑路; 4月三日,交易所 Mt.Gox被DDOS攻击,比特币价格大幅下跌; ……
确保交易平台的安全性的方法除了制定良好的登录和交易密码之外,最好的方法是把一部分比特币转移到自己私有的钱包,自己的安全性由自己保证,这样不管交易平台是跑路还是被攻击也不至于损失全部。
本地钱包的安全钱包文件记录着证明自己对该钱包所有的私钥等重要信息,所以本地钱包一定要安全保管并且妥善备份。保护本地钱包同时意味着必须保证自己的电脑上有足够的安全措施,包括操作系统(尤其是Windows这样的大众操作系统)必须及时更新(包括升级到较新的版本,比如2013年来说应该升级到 Windows 7 或 Windows 8 ),使用自带的更新功能(比如 Windows Update )打上最新的补丁,如果有必要的话装一些安全软件,例如防火墙和杀毒软件也是不错的选择。
山寨币上位随着比特币的流行,无数的山寨币也被强势推出,据说创造一个新的山寨币只需要1个比特币。这些山寨币中抱着捞一把就走,改改比特币客户端参数的大有人在,但是其中一些也提出了一定的改进(比如性能、交易时间等),这些改进中不乏有价值的改进。可以遇见一旦一个新的山寨币提供了足够吸引人的特性或者解决了比特币面临的一些严重的问题,将会迅速上位并且压过比特币的先发优势。
密码学级别的破解比特币使用的算法遭到破解,虽然说起来好像天方夜谭但是不是没有可能发生,比如历史上曾经流行过的对称加密算法DES因为密钥过短早就推荐不使用,而转为用3DES、AES以及Blowfish等替代;曾经流行的流加密算法RC4因为强度不够也遭到各种有效的攻击;而流行的散列算法MD5在2004年被山东大学数学系教授王小云发现了快速碰撞的方法把产生碰撞的步数从之前的2的80次方先后降低到2的69次方和2的63次方(这个降低的级别在计算机的角度是惊人的)。
我们可以看看一些著名的加密算法提出的时间以及到被不推荐使用甚至废弃(遭到非常有效的攻击)的时间:
MD5(1992-2004),12年;
SHA-1(1995-2013),18年;
DES(1976-1999),23年;
现在的产品中MD5和SHA-1还在大量使用,微软官方博客就宣布在2016年之前废弃SHA-1和RC4了。
比特币设计比较领先,2009年产生时已经使用了当时已经确立标准的最新的SHA-256以及RIPEMD-160散列算法,同时还选择了非常先进的采用secp256k1曲线的椭圆曲线公钥算法。这些密码学的基础措施在目前(2013年)看来依然十分安全,但是随着密码学家进一步的研究配合更加高性能的机器的暴力破解,这些算法会变得越来越脆弱,此时无论是迁移到新算法还是加强现有算法都会变得非常困难。
大运算力的暴力破解有人计算过,一个比特币私钥的长度是256 bits,要穷举所有的可能来破解该私钥需要:
pow(2,128) / (15 * pow(2,40)) / 3600 / 24 / 365.25 / 1e9 / 1e9 = 0.6537992112229596
也就是650000000000000000年。看上去好像比特币绝对安全了,但是如果考虑摩尔定律,每18个月计算机的性能提高一倍,两个十八个月就变成了原先的四倍,这样的增长实际上是非常惊人的。计算下来的结果就是只要59年后,计算机就能够在有意义的时间(比如1.13年内)破解一个私钥,也就是破解了某人的钱包,这是非常危险的。
你可能会说59年也足够长了,且慢,你还没考虑到专门针对破解用的硬件。显卡和专用集成电路制造的矿机能用来挖矿,为什么不能用来破解?
政府的政策虽然比特币等基于密码学的货币的一个功能就是抗来自政府的通胀,但是千万别以为政府的措施会很有限,如果需要剿灭(或者在某一地区剿灭)比特币,只需要在比特币赖以生存的介质–网络上下手即可。在比特币找到更加难以封锁的介质之前,来自政府的态度也是不容忽视的。
如果你觉得我写的文章对你有帮助,可以捐一些比特币给我:
1Ay1EYzDcRT2dQxHbDhLQRwkNgKPZHyBMQ