首页 >> 行业深度 >>行业分析 >> EOS的BM:为什么区块链是更好的应用服务器/数据库架构?
详细内容

EOS的BM:为什么区块链是更好的应用服务器/数据库架构?

时间:2020-02-12     作者:碳链价值【转载】

前言:传统web应用架构存在安全性问题,为了确保更高程度的安全,企业耗费巨资,不过依然无法从根本上解决问题。而本文作者Daniel Larimer(也就是众所周知的EOS的BM)则认为要解决这个问题,需要采用区块链的架构来确保数据库和用户账户的安全,可以防止未经授权的访问和防篡改,同时可以为采用区块链技术的企业节省费用。BM认为区块链是更好的应用服务器/数据库架构,未来会成为很多企业的必备技术,这会是超级大的潜在市场吗?大家如何看?

传统的web应用基础架构在设计时考虑了安全性,并且二十五年来,公司一直在试图修补根本上存在不安全的体系架构。该架构设计的假设是服务器可以被信任和保护,但多年的经验告诉我们,没有服务器可以免受外部攻击,更不用说内部的危险了。换言之,服务器从根本上是中心化的。

我们曾经把“安全问题”归结为用户和服务器之间的连接,因此,我们引入了SSL和HTTPS。但是,后来我们发现,黑客会破坏数据库并窃取密码。因此,我们开始存储密码的哈希值,但接下来我们又发现,在窃取哈希值后,黑客可以使用暴力破解密码。随后,我们引入密码轮换,这样在黑客进行暴力破解时,密码会发生更改。如此这般的攻防,不断上演。(蓝狐笔记:SSL是为网络通信提供安全的协议,SSL协议位于TCP/IP协议和应用层协议之间,对网络连接进行加密。而HTTPS则是在HTTP的基础上加入SSL。)

企业花费数十亿美元,试图保护其服务器和数据库,尽管付出这些努力,但依然没有简单方法来审计系统,且能确保企业按他们的意愿运行。

Block.one正在构建区块链软件以确保数据库和用户账户的安全,防止未经授权的访问和未经说明的修改。使用区块链时,用户采用高度安全的私钥,这些私钥存储在安全硬件,且私钥用于签名每个用户交互,而不是简单验证与服务器的连接。(蓝狐笔记:Block.one是开发EOSIO软件的公司)

区块链创建不可篡改的日志,它构建绝对和确定性的顺序,接收用户输入,而智能合约提供确定性的商业逻辑,以确保所有系统的一致性。

未来的Block.one正在创建消除密码和昂贵审计的方法,可为公司节省数十亿美元,防止身份被窃取,并为所有人提供更高的可靠性和审计能力。我多年来坚定地认为,每个多用户网站都可以因为采用区块链后端而受益。与流行观点相反,区块链并不一定是缓慢的低效的数据库,也不必一定在抗审查和开放访问的基础上运行。

即使区块链完全由公司本身运营,且区块链的所有内容都不公开,区块链也能为公司在安全、审计能力、透明度以及业务流程完整性上提供巨大改进。本文旨在阐明区块链在企业环境中的真正价值,并为区块链行业指明前进方向。

常见的误解

在区块链行业中,很多人的看法是,只有当区块链将彼此不信任的各方连接起来时,区块链才能带来好处。他们认为,传统数据库技术已经可以完成确保业务完整性所需的一切。换句话说,他们认为有了传统的数据库复制和“数据完整性”保证就已经足够。在此过程中,他们要么忽略要么不了解区块链提供的根本不同的安全性和完整性保证:

  • 对全球时间顺序的承诺

  • 业务逻辑的确定性执行

  • 业务逻辑&数据完整性的紧耦合

  • 消除密码

在传统的业务应用架构中,业务逻辑跟数据库是分离的。通常有应用服务器,例如Node.js或J2EE,其提供了修改数据库的密码。Node.js服务器的作用是通过密码或多因素身份验证机制来实现对用户的验证。一旦应用服务器进行用户身份验证,它将发起会话令牌,该会话令牌用于验证未来的用户交互,直至会话超时或会话(如IP)的某些元素发生改变为止。

很显然,这种传统的设计通过由应用服务器管理的单个登录名/密码来执行所有数据库操作。应用服务器负责用最终的终端使用来执行其自身的身份验证方案。同样,也很显然,通常有多方可以访问用户名和密码。数据库管理员可以对多个不同的应用服务器和/或个人分配和撤销凭证。

先进的系统确保,在水平扩展的系统中每个应用服务器都有其自己的用户名/密码,且在某些情况下,它甚至可以使用公钥基础设施(PKI)和硬件安全模块(HSM)。

然而,即使在这里,数据库也仅对与应用服务器的连接进行验证。为了提供审核日志,它必须记录安全连接的整个数据流。然而,即使这个日志仅记录应用服务器请求的“读取和写入”,该应用服务器已经丢失关于原始用户意图的所有信息。

审查这种系统的审核员无法知道应用服务器(如Node.js)是否遵循了正确的业务逻辑且正确验证了终端用户。Node.js进程可以将用户操作“记录”到数据库中,便于审核员可以尝试重现相同的计算,但这种记录本身并非不可篡改,且并不附带独立可验证的身份验证,无法验证最终用户是否实际上授权了其记录的操作。

可以尝试记录每个用户的连接,但由于用户经常通过这样的连接传输密码,因此,这些记录最终会创建可能会导致泄露用户身份凭证的蜜罐。(蓝狐笔记:蜜罐意为黑客喜欢攻击的丰盛之地)更负责的系统可能会对这些日志进行加密,以便只有审核员才能读取。

假设审核日志没有被篡改,审核员必须通过应用逻辑跑出相同的操作序列,以验证结果数据库状态是否匹配。这意味着应用服务器必须以确定性的方式来实现。

确定性计算是不容易的

尽管写确定性代码看起来“容易”,实际上,所有通用计算机语言都是非确定性的,因为它们允许开发者访问存在数据库中的外部数据。这可能是一些简单的数据,如时间戳、内存地址、环境变量、IP地址、或其他更微妙的数据,例如硬件上的浮点行为或哈希表的插入顺序。

在很多情况下,只是简单地访问长时间运行的应用服务器的内存中的变量就足以引入不确定性。启动/停止应用服务器的实际操作必须被记录和重现,否则在重放过程中每个本地内存访问都可能是非确定性的。

事实真相是,对于在通用陷阱中受过训练并积极寻找非确定性的最佳开发者来说,编写确定性的代码是具有挑战性的。典型的商业应用开发者会发现以确定性方式编写代码很难或不切实际。

如果我们走得更远,并且假设应用代码是确定性的,那么,应用忠实记录用户事件,我们依然还要面临跟踪在任何特定时间部署的代码版本的挑战。应用是动态的且频繁更新的,因此,应用代码自身也必须是数据库状态的一部分,且其更新必须跟用户操作一样以同等的安全性和可审计进行管理和记录。之后,审核员需要所有应用服务器代码的版本的拷贝,并需要根据每个版本的升级重放用户输入(并在过去每次重启时重启代码)。

即使单个应用服务器在其实现和部署方面都能够以确定性的方式运行,它仍然会面临重大的可扩展性问题。应用服务器仅有一个实例能运行在数据库上。通过复杂锁来实现并行访问,但即便是锁上的竞争条件也必须被记录和重现,否则具有不同本地变量的应用逻辑的两个实例可能会产生非确定性的输出。

在这一点上,人们可能会试图完全抛弃确定性,但是,如果缺乏确定性,那么些许的差异就会随时间推移而加剧,并最终导致数据集产生巨大差异。审核员将被迫使用模糊逻辑和近似匹配,并且每个人将不得不相信这个“模糊逻辑”足够好。当然,否定编写和部署确定性代码的所有努力的唯一方法是,数据库管理员直接修改代码且神不知鬼不觉。

在某些情况下,用户输入日志和状态的仔细更新可能会创建出两个不同的数据库状态,每个都通过确定性测试,然而仍具有不同且不可调和的输出。

例如,假设教授将一位学生的分数F提交到系统,然后该学生通过黑客入侵或贿赂方式进入数据库,并更改其成绩以及教授提交的日志。

更换密码

任何关心完整性的多用户系统的最终目标是确保用户输入不会被伪造。用户名/密码的使用,甚至其他多因素身份验证(如SMS或谷歌双重验证)的使用都依赖于服务器得出这种结论:密码匹配或输入了正确的SMS码/邮件链接/双重验证码。很显然,这对于系统的完整性来说是巨大的问题,我会提供一个真实案例,来说明这些系统的严重程度。

2016年,我在一个加密交易所的账户被黑客入侵,它允许黑客窃取数万美元价值的比特币。从我的视角,这种黑客行为先是显示有一封“密码重置”的电子邮件发送到我的电子邮箱,然后另外一封邮件显示密码已被成功重置。随后,收到一封邮件,要求确认提取比特币(附有代码/链接)。最后,收到通知说提现已经完成。

乍一看,似乎是电子邮件被黑客入侵,但考虑到我在电子邮件中采用了多重因素登录,不太不可能被入侵。快速浏览我的电子邮件安全页面显示,并没有未经授权的访问。我知道是因为谷歌记录并显示了所有访问我电子邮件的IP/设备。

而这其中发生的事情是,攻击者在邮件抵达我的邮箱之前截获了交易所发送的邮件。应用服务器无法知道邮件已被拦截,因此只是基于攻击者拥有应用服务器生成的一次性代码,实现密码重置和提现的授权。

针对SMS或其他任何依赖于非用户控制私钥的技术,都可能被相同方法利用。归根结底,保障用户账户安全的唯一方法是让所有用户都采用基于硬件的私钥作为其登录凭证,并且结合稳健且耗时的过程,以在硬件密钥丢失时便于安全的重置。

在这一点上,多用户业务应用现在可以使用用户私钥签名每个用户请求,将该签名的请求记录在数据库中,并使用确定性代码进行处理。即使这样,也没有提供人们期望的完整性,因为整个用户请求依然可以被删除也有副作用。想象一下,破解警察数据库并删除由警察在提交用户票证时签署的请求。

说到此处,精明的工程师会声称,每个我提出的问题都可以通过改变程序逻辑来解决。他说得没错,经验丰富的应用开发者可以使用“传统数据库”、“传统应用服务器”以及“通用加密原语”,并构建相对安全和可审计的系统。基于同样的逻辑,精明的工程师可以声称数据库是完全不必要的,相反,所有内容都应该直接构建在文件系统上。

而其他工程师可能会指出,可以通过从头开始编写所有代码来提升性能,而不是依赖于诸如Node.js和J2EE这样的应用服务器框架。几乎所有东西都是由较低层级的技术构建的,我们不妨为实现最佳性能设计晶体管。(蓝狐笔记:此处意为这些解决方案的成本极高)

我提出这一极端建议,是因为它突出了更高层级框架在加速和确保新应用开发安全方面的真正作用。很少有人编写自己的密码学库或算法,而真正编写的人要么是专家,要么是当系统被黑客入侵时充当警戒尾巴。从头开始开发/重构一切会导致每个应用比基于成熟框架构建的应用成本更高。

区块链应用程序/数据库服务器的好处

诸如EOSIO这样的区块链和开发框架之所以存在,是为了将应用开发者从不得不重新发明“数据库”以构建安全应用中解放出来。安全性和确定性很难,这就是为什么将技术构建在抽象细节的层上的原因。

EOSIO在同一进程中将确定性执行环境(WebAssembly)和快速数据库结合起来。所有用户操作均由其私钥签名,并记录在复制的分布式的数据库中,且具有向区块头做出公开承诺的能力。

像EOSIO这样的框架达成传统系统这般强大和易于开发,只是时间的问题。通过将应用逻辑(Web Assembly)放在与内存数据库相同的处理空间中,EOSIO的体系结构在很多方面已经比传统系统性能更高。

在未来几年中,Block.one旨在添加工具和界面,以使得在区块链上部署业务应用跟在传统业务应用架构上部署应用一样容易(或更容易)。

显而易见,区块链技术的采用将会是有责任防止欺诈和进行财务报告的政府机构、上市公司和企业的优先事项。我的看法是,未来不采用区块链技术就像是现在的银行不采用SSL技术一样,一旦区块链技术广泛可用,不采用区块链技术就可能被认为是过失。

今天到了该采取行动的时候了。如果没有对当今应用构建方式的根本改变,业务和用户是不安全的。每耽搁一天,业务面临可能有被欺诈和被黑客入侵的风险。