欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  头条

区块链是如何使用密码学来进行保护的

程序员文章站 2022-03-29 19:52:42
...
密码学是应用数学函数以保证数据安全性的科学。

许多风靡的影视作品都在向人们暗示:只要有足够厉害的黑客,任何系统都可以被攻破。这种“好莱坞式黑客攻击”并不是真实世界的场景——黑客必须发现系统暴露的漏洞,例如未上锁的服务器机房、易于猜测的密码、未受保护的网络端口或者内部安装的“后门”,以进而实现未经授权的访问。

虽然我们的确永远无法确保一个系统没有任何漏洞——毕竟系统都是由不完美的人类所完成的,但是“任何系统都可以被攻破”这一观点却是错误的。自90年代初以来,我们利用密码技术已经可以实现完全免受黑客攻击。但这一技术在应用时有时会留下被黑客利用的空间。

密码学本身并不会被黑客攻破以生成伪造的数字签名(马上会给出定义),就像数学不能被黑客攻击而使得2+2=5一样——虽然密码学和数学都可能被错误地使用。如果一个使用密码学的系统被攻破,那只可能是因为设计者错误地应用了密码学。这不是因为密码学不起作用,也不是因为有人“破解”了密码学——就像你的银行错误地处理了你的账户时不是数学的错误、你的妈妈下载不熟悉的附件而感染计算机病毒时不是电子邮件的错误一样。这是一个很重要的特点,因为比特币是一个非常直接的密码学应用。

密码学并不是一种未经考验的新技术。比特币所使用的所有密码学技术自互联网诞生以来一直都在使用着,是每天使用的许多常见互联网协议的重要部分。计算机科学家认为密码学是可靠和必要的,就像NASA(美国国家航空航天局)认为宇航科学是可靠和必要的一样。

公私钥对:密码学的基石

公私钥对是区块链所使用密码学的基石。公私钥对包含两部分:私钥和公钥。这两个密钥实际上只不过是具有特定数学关系的大整数,用于代替密码和用户名。

你会拥有一个公钥,就像你的名字或用户名一样:在大多数情况下,你可以向任意请求者分享你的公钥,而拥有它的人可以用它来引用或联系你。它与你的名声(或者比特币中你的交易历史)绑定,所以你可能会有多个公钥(因此有多个公私钥对)用于不同的目的。公钥可用于引用或查看帐户,但它自身并不能对该帐户作任何操作。

私钥应该像密码一样:不应向任何人分享,它用于验证某些操作,例如发送BTC(比特币)。

但是私钥和密码之间存在重要的区别。要使用密码,你必须将其发送给某个人或服务器,以便其对密码进行验证。你需要相信密码在发送后会被负责任地处理。相比之下,私钥可用于证明自己的身份而无需将其发送给任何人。它曾经存储或直接使用过的唯一场所就是在你的本地设备上。

这一点很重要,因为如果你可以在不向任何人发送你的秘密信息的情况下对自己进行身份认证,则可以保证完全控制其安全性——你不易受其他系统的安全漏洞影响。这是使比特币不可撼动的重要组成部分。比特币本身并没有存储可能泄露给攻击者的密码或私钥,但用户仍然可以对交易进行验证。

但是,如果你从来不曾向任何人发送私钥,那么如何使用私钥来验证交易呢?答案与私钥和公钥之间的数学关系有关:数字签名。

数字签名

有许多种不同的生成和验证数字签名的技术,支撑它们工作的数学原理远远超出了本文的范畴。对于那些不熟悉密码学的人来说,这里所描述的过程最初听起来可能令人难以置信。我很清楚地记得,当我四年前刚开始研究比特币的时候就有过这样的感觉。

现在我将再次简要提到,这些技术被用于许多常见的互联网协议中,并且是信息科学的既有组成部分。

想象有Alice和Bob两个人,他们已经在私下交换了公钥。Alice想给Bob发送一条消息,但Bob是一个非常多疑的人,除非他能够以数学的方式进行确定性地证明,否则他不相信该消息确实来自Alice。为了便于证明,他们同意使用数字签名。

为了生成签名,Alice使用她计算机中的签名生成算法,该算法将她的私钥和完整的消息作为输入,生成一个数字签名。然后,她将这个消息/签名组合发送给Bob——但重要的是,她不会发送她的私钥。

当Bob收到消息和签名时,他可以调用一个与之互补的签名验证算法。该算法将消息和签名作为输入,以确定Alice用于生成签名所使用公私钥对中的公钥。当Bob看到他的算法输出Alice的公钥时,他就已经在数学上证明了该签名确实是用Alice的公私钥对生成的,即使他不知道也无法计算Alice的公私钥对中的私钥。

更简洁地说,这一数字签名的过程允许Bob验证该消息不是由某个第三方创建或修改,而是必须使用Alice的私钥才能生成的,而不必(或不能)知道她的私钥。他需要的只有消息/签名组合和她的公钥。

直觉上来看,这似乎难以置信,你可能会觉得好像在哪里产生了误解。如果Alice的私钥和公钥密切相关,并且Alice使用她的私钥生成Bob收到的签名,那他为什么只能派生出她的公钥而得不到她的私钥?要理解这一问题的答案要求比大多数人对数学更深入的理解,这远远超出了本书的范围。

尽管如此,这项技术每天都在被赖以使用,并且在密码学社区内被认为是坚如磐石的。当你访问某个地址以https开头的网站时,“s”就表示该网站使用数字签名认证了它自己。你的计算机使用了签名验证算法,就像上面例子中的Bob一样,验证网站确实来自正确的公私钥对。数字签名可以确保你和网站之间的任何进一步交互都是经过加密和认证的。如果验证失败,浏览器则会警告你,并将该网站标记为危险。

足够大的整数

在此之前,我简单地提到了私钥和公钥的功能就像用户名和密码一样,但实际上它们只不过是具有特殊数学关系的大整数。鉴于此,我经常被问到以下问题:

“能不能使用计算机猜测或者计算出一堆数字,并尝试将它们作为私钥使用?他们最终是否会碰到某个目标公私钥对的私钥,从而获得对该身份的控制权?”事实上,就比特币而言,这将使攻击者可能窃取一些公私钥对所持有的比特币。

这是一个很好的问题,但它并不会发生。如前所述,有几个拥有价值数百万美元BTC的比特币地址,但它们好几年一直都没有被转移——尽管盗取它们需要的只是正确的私钥——也就是正确的大整数!如果你能猜到这些地址的私钥,那么你就可以将其中的钱发送给任何人。与密码不同,你可以在自己的机器上本地验证私钥,没有服务器会限制你的尝试次数或频率。

那为什么还没有人偷走这些钱呢?答案在于用作私钥的数字近乎荒谬的大小。它们足够大。

我们从一个简单的思维实验开始。想象一下,你的私钥足够大,大到世界上所有的计算机一起工作,他们需要24小时才能猜到。如果在你的私钥上增加仅仅一位数字,计算机就需要十倍的计算量,也就是需要十天而不是一天。而增加六位数字会使这一时间达到27000年。

在任何情况下,生成私钥所需创建随机数的计算能力都是微不足道的。使用私钥生成签名以及使用公钥验证这些签名在计算上也是简单的。但猜测私钥所需的工作量却随着每添加一个额外数字呈指数增长。为了使私钥“免疫”于暴力破解,我们只需要添加足够的数字——我们只需要使它们足够大。

那多大是足够大?比特币中使用的私钥是256比特的整数,相当于一个长度为76位的数字。这一数字的大小是令人难以置信的。接下来的阐释大部分来自于Bruce Schneier的图书《Applied Cryptography(应用密码学)》,对足够大整数进行直观说明。

首先,需要了解到热力学第二定律的一个具体结论是改变单个二进制位信息存在所需要的最小能量(将1变为0或反之)。这意味着无论所使用的硬件如何,任何计算过程都需要一些最小的能量来执行。

现在假设你能够利用太阳的全部能量输出来驱动一台专门设计的计算机,这台计算机的工作是计算或猜测私钥,以找到一个公私钥对的私钥(可以控制BTC)。

使用一点点数学和热力学,你会发现一台具有太阳全年能量输出计算能力的高效计算机可以计算出2178个值。如果我们将这个值除以可能的私钥数量,即2256,我们发现这个拥有太阳全年能量输出计算能力的假想计算机只能猜测或计算出可能私钥总数的0.0000000000000000000003%。

此外,这还只是计数,并不包括实际检验每个私钥以验证它是否与正确的公钥对应这一更复杂的任务。因此,这台计算机在一年之内可能错过这0.0000000000000000000003%概率的正确私钥,而它甚至都不会意识到。

这些数字与设备的技术无关; 它们是根据20世纪30年代以来建立的热力学定律所得出的可能达到的最大值。这些数字意味着对256位密钥(比特币使用的密钥)的暴力攻击将是不可行的,除非计算机是由物质以外的东西构建并占用空间以外的东西。

这就是足够大整数的能力。无论黑客有多厉害,除非他能够利用3×1023个太阳的能力计算一年,或者一个太阳的能力计算3×1023年,否则他的电脑甚至无法完成对所有私钥的计数——更不用说测试或者以其他方式使用它们了。