低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

密码学是如何保护区块链的?

2019 年 10 月 24 日

密码学是如何保护区块链的?

密码学是应用数学函数以保证数据安全性的科学

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


虽然我们的确永远无法确保一个系统没有任何漏洞——毕竟系统都是由不完美的人类所完成的,但是“任何系统都可以被攻破”这一观点却是错误的。自 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)。


使用一点点数学和热力学,你会发现一台具有太阳全年能量输出计算能力的高效计算机可以计算出 2^178 个值。如果我们将这个值除以可能的私钥数量,即 2^256


,我们发现这个拥有太阳全年能量输出计算能力的假想计算机只能猜测或计算出可能私钥总数的 0.0000000000000000000003%。


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


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


这就是足够大整数的能力。无论黑客有多厉害,除非他能够利用 3×10


^23 个太阳的能力计算一年,或者一个太阳的能力计算 3×10^23 年,否则他的电脑甚至无法完成对所有私钥的计数——更不用说测试或者以其他方式使用它们了。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接:


https://mp.weixin.qq.com/s/vc01vnQ3tAohFGmO2GK--g


2019 年 10 月 24 日 23:14344

评论

发布
暂无评论
发现更多内容

五年Java开发经验,4面阿里成功拿下offer,分享一下个人面经!

Java架构之路

Java 程序员 面试 算法 编程语言

阿里内部《Java架构进阶宝典》,总结了基础、进阶、架构三个阶段的知识点

Java架构之路

Java 程序员 面试 算法 编程语言

区块链钱包软件开发费用,区块链多币种钱包

135深圳3055源中瑞8032

一线城市年轻人生活工作实录(程序员篇)

Marilyn

敏捷开发 开发者工具 快速开发

架构师训练营 1 期第 4 周:系统架构 - 作业

piercebn

极客大学架构师训练营

区块链USDT支付系统开发需要多少费用?USDT跨境支付

135深圳3055源中瑞8032

Go语言内存管理三部曲(一)内存分配原理

网管

go 内存管理 内存布局

合约跟单交易系统开发,一键智能跟单软件

135深圳3055源中瑞8032

微前端之如何拆解React巨石应用 qiankun

SugarTurboS

项目管理 架构 React 微前端 前端性能优化

WSDM Cup 2020大赛金牌参赛方案全解析

华为云开发者社区

大数据 搜索 信息

阿里P8大牛呕心沥血总结整理的《Java面经手册》,通过实践的方式向你深度讲解Java核心知识点

Java成神之路

Java 阿里巴巴 程序员 面试 编程语言

年轻人大企打拼多年,刚升迁便遇巨大阻力难以解决,到底如何才能在职场中幸存?

Marilyn

敏捷开发 快速开发

JVM-技术专题-Java类文件结构

李浩宇/Alex

Java JVM

JVM-技术专题-对象的实例化过程

李浩宇/Alex

Java JVM

有一说一,大型信息化企业的软件系统,还是用自研的好

Marilyn

敏捷开发 快速开发 开发工具 软件设计

用友政务表格技术应用开发实践:预算一体化产品核心功能搭建

Geek_Willie

SpreadJS 用友

MySQL-技术专题-性能优化—索引篇

李浩宇/Alex

Redis Sharding集群跟一致性哈希有什么瓜葛?

Man

一致性哈希 Jedis redis cluster

JVM-技术专题-深入理解内存结构

李浩宇/Alex

Java JVM

数字货币交易所开发,币币交易源码

135深圳3055源中瑞8032

医院HIS故障,险引发人命关天大危机,竟被程序员轻松解决!

Marilyn

有了TA,领域外企业里的小IT团队,也能轻松搞定大型项目

Marilyn

敏捷开发 快速开发

TensorFlow 篇 | TensorFlow 2.x 基于 Keras 的模型保存及重建

Alex

tensorflow keras model save model restore tensorflow hub

医疗AI系统构建(1)one-hot编码

刘旭东

人工智能 学习 医疗AI one-hot

图扑软件联手阿里Lindorm数据库开启工业物联超融合存储模式

许力

IoT AIOT

百度人工智能OCR调用调试过程

tuuezzy

Lindorm云原生数据库 - 让数字时代IT运维系统“灵动”起来

许力

DevOps APM Data Lake AIOPS

为什么巨头都在布局SaaS生态?

ToB行业头条

SASS

阿里面试官纯手打:金九银十跳槽必会Java核心知识点笔记整理

Java架构追梦

Java 数据库 架构 面试 微服务

一线城市年轻人生活工作录(业务员篇)

Marilyn

敏捷开发 快速开发

企业开发遇到瓶颈,何不换个新思路?快速开发了解一下

Marilyn

敏捷开发 快速开发

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

密码学是如何保护区块链的?-InfoQ