写在前面:本文作者为EOS创始人Daniel Larimer。他在文章中分析了传统互联网中的数据库等基础架构和设计的缺陷并指出区块链是最好的解决方案:诸如EOSIO之类的区块链开放式框架使得开发者无需为了构建安全的应用程序而重新创建“数据库”,因为所有用户使用私钥对自己的行为签名,可追溯和查证。未来B1的一个目标是添加工具和接口,促使在区块链上部署业务的过程和传统互联网上部署业务相似(甚至更简单)。
传统的网页应用程序基础结构在设计时将安全性作为事后考虑事项,在过去的25年中,许多公司一直在试图修补一个根本不安全的架构。这种架构在设计时就预设服务器是可以被信任和保护的,但是多年的经验告诉我们,没有服务器是安全的,更不用说内部的攻击了。换句话说,服务器基本上是中心化的。
我们过去认为“问题”在于用户和服务器之间的连接,因此我们引入了SSL和HTTPS。但后来我们发现,黑客会破坏数据库并窃取密码。所以我们开始存储密码的哈希值,但后来我们发现黑客会在盗取哈希值后强行破解密码。然后,我们引入了密码切换机制,以便在暴力破解时更改密码,诸如此类的措施还有很多。
为了保护服务器和数据库,企业需要花费数十亿美元,尽管付出了所有努力,但仍然没有简单的方法来审查系统并确保企业按预期运行。
Block.one正在构建区块链软件,以保持数据库和用户账户的安全,防止未经授权的访问和未予解释的修改。有了区块链,用户可以使用高度安全的私钥,这些密钥存储在安全的硬件中,用于对每个用户交互进行签名,而不是简单地进行服务器连接的身份验证。区块链创建了一个不可更改的记录,建立了接收用户输入的绝对和确定性的顺序,而智能合约提供了确定性的业务逻辑,确保了所有系统之间的一致性。
未来的Block.one正在消除密码和昂贵的审计,为企业节省数十亿美元,防止身份盗窃,并提供更高的可靠性和可审计能力。
多年来,我一直认为每个多用户网站都可以从区块链后端中获益。和很多人的认知不同,区块链不必是缓慢、低效的数据库,也不必在抗审查、开放的基础上运行。区块链可以在安全性、审计能力、透明度和业务流程的完整性方面提供重要的改进,即使区块链完全由公司自己操作,其中的所有内容都不会公开。本文旨在揭示区块链在企业环境中的真正价值,并为区块链行业的发展指明方向。
在区块链行业中,许多人认为区块链只有在将互不信任的参与方连接起来时才会创造优势。他们认为,传统的数据库技术已经可以完成确保业务所需的所有工作。换句话说,他们认为传统的数据库复制和“数据完整性”保证就足够了。在这个过程中,他们要么忽视要么无视区块链所提供的完全不同的安全性和完整性保证:
由于钱包维护 Poloniex暂时禁用ETH和ERC-20钱包:10月21日晚间,Poloniex交易所官方发推称,由于ETH和ERC-20钱包正在进行维护,因此暂时被禁用。[2020/10/21]
1. 对全局事件序列的承诺
2. 业务逻辑的确定性执行
3. 业务逻辑和数据完整性的紧密耦合
4. 消除密码
在传统的业务应用程序架构中,业务逻辑与数据库是分离的。通常有一个应用服务器,如Node.js或J2EE,提供了修改数据库的密码。Node.js服务器的作用是通过密码或多因素认证机制对用户进行身份验证。一旦应用服务器对用户进行了身份验证,它就会发出一个会话令牌,用于对未来的用户交互进行身份验证,直到超时或会话的某些元素(如IP)发生更改。
显然,这种传统设计通过应用服务器管理的单次登录/密码执行所有数据库操作。通过最终用途,应用服务器负责部署身份认证机制。显然,通常有多个用户可以访问用户名和密码。数据库管理员可以向许多不同的应用服务器或个人分配和撤销凭据。
高级系统确保在横向扩展的系统中,每个应用服务器都有自己的用户名和密码,在某些情况下甚至可以使用公钥基础设施(PKI)和硬件安全模块(HSM)。但是,即使在这里,数据库也只认证应用服务器的连接。为了提供审计日志,它必须记录安全连接的整个数据流。但是,即使这个日志也只能记录应用程序服务器请求的“读写操作”,而应用程序服务器已经丢失了最初用户意图的所有信息。
审查这样一个系统的审计师无法知道应用服务器(例如Node.js)是否遵循正确的业务逻辑,是否正确地验证了最终用户的身份。Node.js进程可以将用户操作记录到数据库中,方便审计师复制同样的计算,但这样的记录并非不可篡改,而且没有独立认证验证,无法了解终端用户真的授权了某一行为。
可以尝试记录每个用户的连接,但是由于用户经常通过连接传输他们的密码,这些记录最终会成为一个泄露用户信息的蜜罐。更复杂的系统可以对这些记录进行加密,这样只有审计人员才能读取它们。
假设审计日志没有被篡改,审计人员将不得不通过应用程序逻辑运行相同的操作序列,以验证最终数据库状态是否匹配。这意味着应用服务器必须以确定性的方式实现。
虽然编写确定性代码似乎很简单,但实际上所有常见的计算机语言都是非确定性的,因为它们允许开发人员获取存储在数据库以外的数据。可以是一些简单的东西,如时间戳、内存地址、环境变量、IP地址,也可以是一些更微妙的东西,如硬件上的浮点行为或哈希表的插入顺序。在许多情况下,访问长时间运行的应用程序服务器的内存变量就足以引入不确定性。启动/停止应用程序服务器的动作必须被记录和复制,否则在重放期间每个本地内存访问可能是不确定的。
事实是,编写确定性代码对于受过常见误区培训、积极寻找非确定性的最佳开发人员来说是一个挑战。典型的企业应用程序开发人员会发现以确定性的方式编写代码是困难的或不切实际的。
如果我们进一步假设应用程序代码是确定性的,应用程序如实记录用户事件,那么我们仍然面临跟踪部署的代码版本的挑战。应用程序是动态的,并且经常更新,因此应用程序代码本身也必须是数据库状态的一部分,并且其更新的管理和记录与用户操作的安全性和可审计性相同。然后,审计人员需要拥有应用服务器代码的所有版本的副本,并根据需要通过每次版本升级来重放用户输入(以及重启代码)。
即使单个应用程序服务器在安装和部署方面都能够以确定的方式进行操作,它仍然会遇到一个主要的可扩展性问题。只有一个应用服务器实例可以在数据库进行操作。并行访问可以通过复杂的锁实现,但是即使锁上的竞争条件也必须被记录和复制,或者两个具有不同本地变量的应用程序逻辑实例也可能产生不确定的输出。
此时人们可能会完全放弃确定性,但是确定性在缺席之后,会逐步在最终数据集累积大量的偏差。审计人员将被迫使用模糊逻辑和近似匹配,每个人都必须相信“模糊逻辑”已经够好了。
当然,要否定编写和部署确定性代码所付出的所有努力,唯一要做的就是让数据库管理员直接修改数据库而不进行跟踪。在某些情况下,对用户输入日志和状态的仔细更新可能会创建两个不同的数据库状态,每个状态都通过了确定性测试,但仍然具有不同的和不可调和的输出。例如,假设一个教授向系统提交了一个学生的成绩为F,然后这个学生可以通过黑客或贿赂的方式进入数据库来更改他的成绩和教授提交的记录。
任何重视完整性的多用户系统的最终目标都是确保不能伪造用户输入。用户名/密码或其他主观的多因素认证(如SMS或谷歌验证)的使用依赖于服务器来判断密码是否匹配,或者是否输入了正确的SMS代码/电子邮件链接/验证码。很明显,这对系统的完整性来说是一个巨大的问题,我将提供一个真实的例子来说明这些系统有多糟糕。
2016年,我在一家加密货币交易所开设了一个账户,后来这家遭到黑客攻击,黑客窃取了价值数万美元的比特币。我当时一共收到了4封邮件,第一封是 “密码重置”邮件,然后是另一封表明我的密码已成功重置的邮件。然后我收到一封要求确认我的比特币提取(带有代码/链接)的邮件。然后我收到了一个通知,说我的提币手续已经办完了。
乍一看,我的邮箱似乎被黑了,但这是不可能的,因为我采用了多因素认证。我的邮箱安全页面显示,没有未经授权的访问。我也能看出来,因为谷歌会记录并显示所有访问我邮箱的IP和设备。
事实上,攻击者在邮件到达我的邮箱之前就截获了邮件。应用服务器无法知道邮件被截获,因此就算攻击者只有应用服务器生成的一次性代码,其还是能获得密码重置和提币的授权。
同样的漏洞也可用于SMS或依赖于用户控制的私钥以外的其他技术。真正安全的用户账户是为所有用户采用基于硬件的私钥作为他们的登录凭证,在硬件密钥丢失的情况下,采用一个稳健的和费时的过程来促进安全复位。
此时,多用户业务应用程序可以使用用户的私钥对每个用户请求签名,将这个签名的请求记录到数据库中,并使用确定性代码处理它。即使这样也不能提供人们所期望的完整性,因为用户请求仍然可能被删除,同时还会产生副作用。想象一下,当一名警官提交了你的罚单,然后所有的州都产出了这个请求,你就可以入侵警察数据库并删除他签署的请求。
此时,精明的工程师会宣称,我提出的每个问题都可以通过更改应用程序逻辑来解决。他是对的,一个成熟的应用程序开发人员可以使用传统的数据库、传统的应用程序服务器和常见的密码原语来构建一个相对安全且可审计的系统。根据同样的逻辑,一个精明的工程师可以声称数据库是完全不必要的,所有的东西都应该直接构建在文件系统上。也有工程师可能会指出,我们可以从头开始编写代码,不再依赖于Node.js和J2EE等应用服务器框架,这样就能提高性能。这就好像所有的东西都是由低水平的技术制造出来的,我们也可以设计出性能最佳的晶体管。
我之所以指出这个极端,是因为它强调了了高级框架在加速和保护新应用程序开发方面的真正效用。很少有人编写自己的密码库或算法,而编写这些库或算法的人要么是专家,要么在自己的系统遭到黑客攻击时成为了反面教材。从头开始开发/重新开发所有东西的成本可能会使每个应用程序都比在经过验证的框架上构建更昂贵。
区块链和EOSIO这样的开发框架之所以存在,是为了让应用程序开发人员不必为了构建安全的应用程序而重新创建“数据库”。安全性和确定性很难实现,这就是为什么技术构建在抽象细节的层中。EOSIO在同一过程中将确定性执行环境(WebAssembly)与快速数据库相结合。所有的用户操作都由他们自己的私钥签名,并记录在一个复制和分布式的数据库中,该数据库具有对区块头进行公开承诺的能力。
EOSIO这样的框架变得与传统的不安全系统一样强大且易于开发,只是时间问题。在许多方面,EOSIO的架构已经比传统系统具有更高的性能,这是因为它将应用程序逻辑放在与内存数据库相同的进程空间中。这就创建了确定性存储过程。
在未来的几年里,Block.one的目标是添加工具和接口,使在区块链上部署企业应用程序就像在传统企业应用架构上部署同类应用一样容易(或更容易)。
很明显,采用区块链技术应该成为政府机构、上市公司和有责任防止欺诈或进行财务报告的企业的优先事项。在我看来,未来几年不采用区块链技术就像银行不采用SSL,一旦该技术得到广泛使用,不使用区块链技术就会被认为是疏忽。
是时候开始行动了。如果应用程序的构建方式没有根本性的改变,你的企业和用户就不会安全。每耽搁一天,你的生意就会面临欺诈或黑客攻击的风险。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。