区块链是否真如我们想象的那般安全?入门教程_区块链小白入门

来源:Medium翻译:头等仓(First.VIP)_Saline “《麻省理工科技评论》的一篇文章《曾被誉为不可破解的区块链如今正遭受黑客攻击》已举例证明,如今区块链已成功被黑客攻破。因此我认为,随着区块链技术变得更易于人们使用,安全性将很可能成为区块链落地方面的一个重点问题,那些频繁与区块链打交道的领头公司应更加注意。区块链在不同商业领域应用的越多,就会

区块链是否真如我们想象的那般安全?入门教程

“《麻省理工科技评论》的一篇文章《曾被誉为不可破解的区块链如今正遭受黑客攻击》已举例证明,如今区块链已成功被黑客攻破。因此我认为,随着区块链技术变得更易于人们使用,安全性将很可能成为区块链落地方面的一个重点问题,那些频繁与区块链打交道的领头公司应更加注意。区块链在不同商业领域应用的越多,就会有越多的人意图发现其漏洞并加以利用。  ”

区块链是否真如我们想象的那般安全?入门教程_区块链小白入门

(注:如今,要写一篇关于区块链的文章实在令人无从下手。因为你做出的预测很可能会在几年后被无情推翻。因此本文不会做出任何预测,也不会对区块链技术的未来发表意见。本文仅探讨关于区块链的一些基本安全问题。  )

在探讨为什么区块链不像大家认为的那样安全之前,首先来概述下这项技术所基于的一些概念和机制。

通过模糊及加密实现安全性

在保护任何东西(尤其是信息)时,人们通常运用模糊及加密这两种方式来实现安全性。

在日常生活中,人们通常对模糊的概念最为熟悉。此概念包括隐藏信息,不让除了需要知道该信息以外的人知道。比如将纯文本密码文件隐藏在计算机的远程文件夹中,其他人很难发现自己能够访问你的计算机。但这种通过隐藏实现安全性的方法不是那么经常用了。其原因很简单:秘密总是有办法被发现的。

而加密则是将信息位置公开,但对数据进行加密,只有拥有解密密钥的人才能访问。

加密的最早用例之一可以追溯到古罗马时代,那时古罗马人利用字母移位的方式来发送军事信息。打个比方,如果将字母移位数设为3,则单词“ hello”可以用“ khoor”来表示(头等仓注:在字母表中,h后三位字母为k,e后三位字母为h,以此类推)。因此,重要消息被如此编码后,就可以放心交由不知道该n值的信使发送。就算这个信使被半途截获,敌方得到了该消息,也不知道该如何破解。放在如今,要破解这个代码似乎很容易,但在古代,这种方法是当时加密技术的巅峰。不过如今的加密函数要复杂得多,人们可以运用各种机智巧妙的方法来生成几乎牢不可破的代码。

区块链就是使用了某一种信息加密方法,即哈希函数(下文会介绍)。加密的数据区块被记录在区块链中,只有那些拥有正确密钥的人才能访问链中的各个区块。

随机性

随机性是所有加密函数(包括哈希)的一个非常重要的方面。加密函数严重依赖于随机数据生成。随机生成的数据或种子不依赖于任何人,而由计算机创建。由于必须知道随机种子才能解密哈希,因此这使得加密函数更难以被破解。

计算机中随机生成的数据为区块链提供支持。为使数据更安全,随机字符串会被附加到区块数据中,然后该区块再被添加到公共账本中。从表面上看,这种方法好像很不错。使用随机字符串生成器似乎无懈可击,可大大降低区块链被黑客攻破的几率。

然而,由于这些随机数据由计算机生成,这就引出了一个问题,它们并不是真正随机的。机器不像人类那样有随机性的概念。计算机反而是使用公式来生成“随机”数据。它们遵循一个能够产生分布均匀的随机字符串的公式,在我们看来,它们似乎是随机值。但实际上,随机性只是我们的一种幻想罢了。无论这一公式有多么完美,由公式产生的随机值永远不会做到真正随机。数学函数只能产生经计算的值。

这一事实对区块链来说并不是一个好预兆。随机性漏洞在黑客社区中人尽皆知,且已被多次利用以发起攻击。

那怎样才能够实现真正的随机性?我们可以自然生成随机值而非通过数学公式吗?我敢说,即使在自然界,也没有什么是真正随机的。任何事情,即使是亚原子粒子间看似随机的相互碰撞,都是可以预测的(但这需要物理学家和哲学家去用心钻研)。

哈希

区块链是否真如我们想象的那般安全?入门教程_区块链小白入门

哈希的工作原理这里就不多加赘述了。对哈希函数不甚了解的用户可以去维基百科搜索查看。它概述得十分到位。

区块链通过大量使用哈希来对区块进行加密,经加密的区块会被添加到公共账本中。一个区块在被添加到区块之前,必须经过以下流程:

1.使用哈希函数对新区块中的数据进行加密。

2.向步骤1的加密区块添加随机数据(字符串)。

3.将步骤2的合并数据进行再哈希。

4.将步骤3的哈希值与难度级别进行对比。如果不达标,则更改步骤2中的随机字符串,然后重复以上步骤。

5.当最终哈希值达标(包括难度),该区块就会被添加到链上及公共账本中。

尽管这些步骤十分安全,但哈希通常存在两个问题:冲突和暴力破解。

哈希函数之所以会发生冲突,是因为它总是会产生固定长度的输出。一个256位的哈希函数总是会产生长度为256个字符的输出。因此,经加密的信息最终的长度都为256个字符。无论是对单词“ hello”进行哈希计算,还是对整本百科全书进行哈希计算,得出的哈希值虽然各不相同,但长度都为256个字符。

因此,哈希函数冲突指的是两个或多个字符串映射为相同的256哈希值。尽管256位字符串(或任何其他有限长度字符串)的排列组合非常多,但仍然存在映射到相同哈希值的情况(虽然有限)。此外,文本数是无限的,你可以通过在字符串的末尾添加一个“a”,以将它与其他文本区分开来。因此,每个经过哈希函数的字符串与其他字符串存在无限次的冲突。这就意味着,你甚至无需知道原始字符串,只需从与原始字符串拥有相同哈希输出的无数个字符串找出一个,即可破解加密或制造安全漏洞。

另外,用暴力破解哈希值其实很常见,尤其是在字符串较短的情况下。如果你拥有一个长度为n个字符的加密哈希值,另外拥有一本涵盖了所有长度为n个字符的哈希值的预填充字典,那么你就可以轻松破解这个加密哈希值。或者你也可以从长度为1的字符串开始计算,算到n,并将输出与加密值进行对比。如果得出结果相匹配,就可以知道原始字符串的值。通过长时间运行一台算力强大的计算机,你可以预填充拥有n字符的较大哈希值。

《麻省理工科技评论》的一篇文章《曾被誉为不可破解的区块链如今正遭受黑客攻击》已举例证明,如今区块链已成功被黑客攻破。因此我认为, 随着区块链技术变得更易于人们使用,安全性将很可能成为区块链落地方面的一个重点问题,那些频繁与区块链打交道的领头公司应更加注意。 区块链在不同商业领域应用的越多,就会有越多的人意图发现其漏洞并加以利用。

不管区块链看起来多么安全,都无法阻挡黑客。没有什么能够阻挡黑客。这是因为该技术所基于并构建的某些概念并不像大多数人想象的那样安全。如上文所述,哈希和随机字符串生成器都存在缺陷。

虽然随机字符串生成器缺乏真正的随机性,以及哈希函数可能出现冲突和暴力破解,这些现在听起来可能有些牵强,但随着将来计算机算力得到显著提高,人工智能得到普遍应用,量子计算飞跃发展,以及机器成本的下降,如果有充足的资源,破解一条区块链并非天方夜谭。

就像其他基于密码学的技术一样,它越流行,就会被找出越多的安全漏洞。

海计划公众号
(0)
上一篇 2020/03/23 18:36
下一篇 2020/03/23 18:36

您可能感兴趣的内容

  • simpsons-in-css使用帮助_《辛普森一家 》 在 CSS 中的字符

    simpsons-in-css使用帮助 官方网址:http://pattle.github.io/simpsons-in-css/ GitHub:https://github.co…

    2020/03/06
  • Lebab入门指南_用于将你的ES5代码转成ES6/ES7

    Lebab入门指南 官方网址:https://uniibu.github.io/lebab-ce/ GitHub:https://github.com/lebab/lebab 简介…

    2020/03/07
  • Angular 实践:如何优雅地发起和处理请求基础知识_请求小白基础

    Angular 实践:如何优雅地发起和处理请求基础知识 Tips: 本文实现重度依赖 ObservableInput,灵感来自同事 @Mengqi Zhang 实现的 a…

    2020/03/20
  • css3 斜切角/斜边的实现方式小白基础_效果菜鸟知识

    设计图含有斜切角的效果时,我们一般想到的方法是切出四个角为背景,然后用border连起来,这样就能显示出该效果了,那么直接使用css呢?下面就整理css做斜边的效果。1、方案一:利用linear-gradient.chamfer{background: #3b3; background: linear-gradient(135deg, transparent

    2020/04/05
  • Css中bem书写规范基础知识_规范小白知识

    bem是基于组件的web开发方法。其思想是将用户界面分隔为独立的块,从而使开发复杂的UI界面变得更简单和快,且不需要粘贴复制便可复用现有代码。BEM由Block、Element、Modifier组成。选择器里用以下连接符扩展他们的关系:`__:双下划线用来连接块和块的子元素` :仅作为连字符使用,连接块或元素或修饰符的多个单词(也可以直接写成驼峰式)–:双

    2020/03/26
  • 什么是angular依赖注入?使用帮助_angular基础知识教程

    依赖注入是Angular的重要特性之一,依赖注入简化了Angular解析模块/组件之间依赖的过程。依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下, 一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。该模式分离了客户端依赖本身行为的创建,这使得程序

    2020/03/31
  • SUI菜鸟指南简单易用、功能强大的UI库

    SUI基础入门 官方网址:http://sui.taobao.org 简介描述:简单易用、功能强大的UI库 SUI 是一套基于bootstrap开发的前端组件库,同时她也是一套设计…

    2020/03/05
  • join-monster入门教程_GraphQL和SQL之间的查询计划和批处理数据获取

    join-monster入门教程 官方网址:https://join-monster.readthedocs.io/en/latest/ GitHub:https://github…

    2020/03/11
  • daterangepicker指南攻略一款jquery日期范围选择器插件

    daterangepicker小白帮助 官方网址:http://www.daterangepicker.com GitHub:https://github.com/dangross…

    2020/03/06
  • 实际项目中用Redis要注意哪些规范?使用教程_规范小白帮助

    Redis功能强大,数据类型丰富,再快的系统,也经不住疯狂的滥用。通过禁用部分高风险功能,并挂上开发的枷锁,业务更能够以简洁、通用的思想去考虑问题,而不是绑定在某种实现上。Redis根据不同的用途,会有不同的持久化策略和逐出策略,所以,在使用和申请 Redis 集群前,请明确是用来做缓存还是存储。Redis的集群有主从和 cluster 两种模式,各有优缺点

    2020/03/24
  • H5DS小白常识_可扩展的HTML5可视化编辑器

    H5DS小白常识 官方网址:https://www.h5ds.com/ 简介描述:可扩展的HTML5可视化编辑器 H5DS(HTML5 Design Software)是一款基于r…

    2020/03/11
  • javascript如何循环遍历对象?入门知识_遍历基础知识入门

    在JavaScript中有多种循环遍历对象的方法,下面本篇文章就来给大家介绍一下使用JavaScript循环遍历对象的方法,希望对大家有所帮助。1、使用for 循环for 循环是 Js 中最常用的一个循环工具,经常用于数组的循环遍历。let arr = [1,2,3];
    for (let i=0; i<arr.length; i++){console.log

    2020/03/22
  • 函数化编程攻略教程_编程零基础入门

    百科定义:函数化编程: 又称泛函数编程,是一种编程泛式,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。简单理解,以函数为单元,对复杂逻辑进行拆分,将复杂逻辑转化为多个简单函数逻辑,同时通过对函数进行层层调用,来达到最终目的。特点: 函数可以作为参数传入,也可以作为返回值返回。1. 纯函数 && 非纯函数定义: 输入一个x产生输出一个唯一

    2020/03/24
  • 纯CSS绘制3D立方体指南攻略_3D基础知识教程

    本篇记录的是使用CSS3绘制3D立方体,并旋转起来。 我的思路:1首先,用div元素画6个正方形摞在一起放在画布中间。为了区分,分别给每个div选择了不同的颜色,并且设置为半透明方便透视。2将6个div元素分为三组(上下一组、左右一组、前后一组),想象以画布中心为圆点,使三组分别沿x/y/z轴旋转90度。3上下一组,一张向上推50%正方形边长,一张向下推50

    2020/03/26
  • MySQL有哪些索引类型?使用教程_mysql基础入门

    从数据结构角度1、B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理2、hash索引:a 仅仅能满足”=”,”IN”和””查询,不能使用范围查询b 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要

    2020/03/30
  • 和程序员约会的十个理由小白知识_约会小白基础

    爱是空气,每个人都庆祝这种伴侣在身边的感觉。但是正如我们所说,程序员除外,程序员参加开发者大会把自己脑袋装的满满的,而不过多思考自己的单身生活。当他所有朋友疯狂地计划他们的情人节约会时,程序员或许会去研究程序而不让自己想起这件事。如果你是个女生,正在读这篇文章,你或许会想–程序员?你是指呆子?为什么会有人想和他们约会呢?那么,我给你十个理由:1、这种刻板印

    2020/03/22