共计 3695 个字符,预计需要花费 10 分钟才能阅读完成。
部署去中心化应用程序 dapp 会引入一些有趣的安全性考虑因素,这些因素可能不会出现在更传统的开发中。我们如何保证 dApp 本地存储的安全性?
提出这个问题的原因是我们在使用 Colony dApp 时遇到的一个重要障碍,那就是如何应对在使用 IPFS 或 Swarm 等分布式存储系统保持本地存储的 dApp 数据安全挑战。
在本文中,我将从 dApp 开发人员的角度来看一下这个问题,然后研究一些可能的解决方案。
共享本地存储 localStorage 的问题
IPFS 运行本地节点 node,它与 Web 服务器捆绑在一起。捆绑的 Web 服务器使节点可以轻松地相互连接并共享网络中其他位置可能需要的数据。
作为一个去中心化的应用程序构建器,你将依赖该 Web 服务器将你的内容从一个节点推送到另一个节点,从而使其可以根据需要立即供最终用户使用。
假设你正在完全去中心化 full decentralized 并且正在避免使用 DNS 或 Web 代理等任何内容来跟踪你的内容在网络上的位置,那么访问 dApp 的方式通常是通过浏览器使用其查询本地节点哈希,如:
http://localhost:8080/QmcefGgoVLMEPyVKZU48XB91T3zmtpLowbMK6TBM1q4Dw/
现在,假设在正常使用期间,你的应用程序将在浏览器的 localStorage 保存数据:可能需要传递一些数据,或者保持本地用户交互的队列,以最大限度地减少链上交易并节省 gas 成本。
浏览器中的本地存储仅限于特定的地址上下文(域和端口)。IPFS 节点是获取此上下文的,这意味着通过 IPFS Web 服务器运行的任何去中心化应用程序将使用具有读写访问权限的相同 localStorage。
这可能是一个大问题。
默认情况下,dApp 的某些 helper 依赖项使用 localStorage 临时将密钥保存在纯文本中。这些数据不应该被看到的一天。
另一个潜在的泄漏问题是保存其内存状态的软件包,以便以后可以恢复。类似 Flux-like 的库通常(相对)安全,因为它们只在内存中运行,但启用持久性状态会将该内存状态放入 localStorage,从而将其打开给潜在的攻击者。
缓解问题的策略
不幸的是,安全没有灵丹妙药:作为一名 dApp 开发人员,为安全起见所做的任何调整都可能需要在开发的其他方面做出一些让步。
以下是你可以做出的一些妥协:
不存储任何数据
这当然是最安全的方法,但它有点像烧毁你的房子来摆脱蟑螂。在本地存储数据的 dApp 中有许多功能和基本行为,删除太多后可能没有应用程序存在的意义了。
此外,有许多库默认使用 localStorage,你必须手动检查每个依赖项并删除任何需要它的库,否则就得自己修改库。
加密一切这在理论上更有前途,特别是因为大多数 dApp 开发人员已经在看板上保持默认加密。
加密的 local storage 值
实际上,加密所有本地存储有点麻烦。要加密数据,必须有一个密钥:但是用户不能将该密钥存储在 dApp 中,因为它将被放在 localStorage,这样做你就将回到原点。
一种解决方案是使用钱包:你的 dApp 可能会以某种方式与区块链进行交互,要求用户解锁其钱包以发送和签署交易。由于无论如何都需要钱包与 dApp 交互,因此可以使用每个帐户的私钥 privatekey 来加密本地存储。
然而,这也有一些缺点:
每次想要与 localStorage 交互时,您都必须询问用户的纯文本私钥。
像 MetaMask 这样的密钥管理软件不起作用,因为它永远不会暴露用户的私钥。
使用 Swarm 和 Mist
Mist 是作为 dApp 和以太坊浏览器构建的,因此它为该问题提供了一些特殊优势。
默认情况下,Mist 支持 Swarm 的 bzz 协议,因此你可以设置一个 ens 地址指向 dApp 的哈希值,然后使用 Mist 无需担心地浏览你的 dApp。
不幸的是,这只会解决通过 Mist 访问 dApp 的用户的问题。
运行本地 Swarm 节点的用户仍然必须通过 localhost 访问,localhost 仍然(可能)将数据泄露给其他 dApp。
为你的 dApp 创建一个浏览器扩展
通过浏览器扩展程序运行你的应用程序将导致它获得单独的上下文(它将不再在 localhost:8080),但它有点减弱了去中心化应用程序的目的,必须要依赖于像 Chrome 网络商店这样的中央权威机构用于管理和分配。
此外,现在你必须为要支持的每个浏览器创建和维护单独的扩展,并通过其自己的特定集中式应用商店进行更新。不爽。
创建一个独立的桌面应用程序
和以前一样,创建独立应用程序是将 dApp 分离到自己的上下文的一种方式,这意味着它将获得自己的包装器(在本例中为 electron)。
独立的桌面应用程序具有额外的好处,可以捆绑外部库和你可能需要的任何其他内容,包括 IPFS 本身的单独实例。
和以前说的一样,要有一些让步:
除非你想要专门在 bittorrent 上分发应用程序,否则你需要找到一个集中托管的解决方案来进行分发和维护。
你必须为 electron 桌面应用程序维护一个单独的存储库。
如果你想将 IPFS 用于任何其他服务,你可能最终会在同一台计算机上运行多个节点,这可能会变得混乱。
将你的应用代理到域名
通过使用其他 Web 服务器代理本地节点,有两个优点:
首先,现在你的 dApp 有一个友好的友好的人类可读地址,而不是一个冗长的哈希。其次,你的应用程序将拥有自己的上下文,并且不会共享 localStorage。
然而,代理确实跨越了“真正的”去中心化,用户将再次不得不依靠中央服务器来访问去中心化的服务。哎。
对于去中心化的应用程序开发人员来说,现在还处于早期阶段。这种问题在新兴的“去中心化协议栈”中无处不在“:而且在我们提出更优雅的解决方案之前可能还需要一段时间。
将来,在浏览器中支持本机 IPFS 或 Swarm 节点可以解决这个问题,并且无需将 Web 服务器与去中心化的文件存储捆绑在一起。用户可以输入类似 ipfs://QmcefGgoVLMEPyVKZU48XB91T3zmtpLowbMK6TBM1q4Dw/ 并直接访问 dApp,并为每个唯一的哈希分配自己的上下文。
Mist 和 IPFS 团队意识到了这个问题,并希望将未来版本中的解决方案纳入其中。
但是现在,找到我们可以采用的解决方法并与社区的其他人分享它们会很有帮助。
如果你是一名开发自己的去中心化应用程序 dapp 的开发人员,希望本文对没构建代码以避免数据泄漏有所帮助,如果你设计了另一个上面未提及的解决方案,请分享它!
感谢 Alex Rea 和 Griffin Hotchkiss 帮助起草本文。
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
java 以太坊开发教程,主要是针对 java 和 android 程序员进行区块链以太坊开发的 web3j 详解。
python 以太坊,主要是针对 python 工程师使用 web3.py 进行区块链以太坊开发的详解。
php 以太坊,主要是介绍使用 php 进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
以太坊入门教程,主要介绍智能合约与 dapp 应用开发,适合入门。
以太坊开发进阶教程,主要是介绍使用 node.js、mongodb、区块链、ipfs 实现去中心化电商 DApp 实战,适合进阶。
C#以太坊,主要讲解如何使用 C# 开发基于.Net 的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
EOS 教程,本课程帮助你快速入门 EOS 区块链去中心化应用的开发,内容涵盖 EOS 工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签 DApp 的开发。
java 比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与 UTXO 等,同时也详细讲解如何在 Java 代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是 Java 工程师不可多得的比特币开发学习课程。
php 比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与 UTXO 等,同时也详细讲解如何在 Php 代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是 Php 工程师不可多得的比特币开发学习课程。
tendermint 区块链开发详解,本课程适合希望使用 tendermint 进行区块链开发的工程师,课程内容即包括 tendermint 应用开发模型中的核心概念,例如 ABCI 接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是 go 语言工程师快速入门区块链开发的最佳选择。
汇智网原创翻译,转载请标明出处。这里是原文 [](http://blog.hubwiz.com/2018/1…://blog.hubwiz.com/2018/12/17/ethereum-dapp-securing/)